In the following we explain the steps taken for the “PROGRAMMING R WORKGROUP PROJECT” of Group 2.1.

Objectives

The objectives of the project are:
1. Explore, describe and analyze the data: For that we performed an EDA
2. Report findings from the EDA: For that we prepared this R Notebook
3. Train a ML model: For that we used available datasets and complemented it with data created by us
4. Make predictions and submit them to Kaggle: This objective is part of the one above.

Problem definition

For this project we will work with a preprocessed dataset originating from the “AMS 2013-2014 Solar Energy Prediction Contest” link. As described in kaggle, the objective of the contest is to “discover which statistical and machine learning techniques provide the best short term predictions of solar energy production.” Contestants, it continues, “will predict the total daily incoming solar energy at 98 Oklahoma Mesonet sites, which will serve as”solar farms" for the contest." The datasets used for this project is explored below.

Libraries

To accomplish all objectives we’ll be utilizing the following libraries. Information about these libraries and material used in the development of this project please check annex I and annex II, respectively.

EDA (part I)

Datasets

We were provided with three (3) datasets:
- solar_dataset.RData: This file contains relevant information from weather stations over solar irradiation.
- station_info.csv: This file contains relevant information over the localization of the weather stations.
- additional_variables.RData: This file contains numerical weather predictions (NWP) relevant to the period in observation.

All this datasets have been loaded as data.table objects as shown below.
- class of solar object: data.table, data.frame.
- class of stations object: data.table, data.frame.
- class of extra_vars object: data.table, data.frame.

Understanding the datasets

Solar irradiation data

This data is contained in the file solar_dataset.RData. Note that this file has been pre-processed, however, we do not have the steps taken for the pre-processing. Therefore, further information about the data within this file is limited. The data contained in this file will be used as is.

On the structure, the dataset has 6909 observations and 456 variables. Each observation correspond to a day. The total period covered is 1994-01-01 to 2012-11-30. Daily incoming solar energy measurements, which are the values of interest, are provided from 1994-01-01 to 2007-12-31 (both included) for 98 weather stations. Each value refers to the total daily incoming solar energy in (\(J/m^2\)) at each site (weather station) measured every 5 minutes and summed from sunrise to 23:55 UTC. As stated in the data description section of the kaggle competition. From 2008-01-01 to 2012-11-30, however, these measurements were not provided with the objective to use the above described set to predict them. A high-level view of the structure is provided in the table below. For detailed statistical information see this section.

Column number Column name Data type Interpretation
1 Date Character Day of interest
2-99 Name of weather station Integer Real values of solar production recorded per day
100-456 Weather predictors Numeric Variables created from different weather predictors given in the Kaggle competition as the result of a PCA

An extract of the file (first 5 rows) is shown below. The extract shows the first column of each type. That is, a variable for the date, one of the 98 variables for the weather station measurements and, one of the 357 variables for the results of a principal component analysis (PCA).

NOTE: We have created a data.table object solar_irradiation from solar (also a data.table) with the following modifications:
- Casting date column to date format and solar irradiation data (columns 2-99) to numeric,
- Dropping all PC columns and rows with NA.

A time series data

The solar irradiation data represents a time series of solar irradiation values measured at each Mesonet (weather station). The figure below shows the time series for one weather station (ACME). From the figure it can be appreciated the ups and downs (cycles) characteristic of solar irradiation.

In reality, these cycles happen during the day, where the peak is normally observed close to noon and the valleys showing at the beginning of the day (early morning) and at the end (late afternoon). The data we have represents the accumulated radiation per day per station. With this data we cannot observe the daily cycle but only the seasonal one. Indeed, solar irradiation also has seasonality.

The figure below shows the seasonal pattern embedded in the solar irradiation time series of the ACME weather station. The figure displays two years worth of observations (from 2000-01-01 to 2001-12-31). Note that a similar pattern is expected for the other 97 sites due to the data under study. A clear distinction between the daily and seasonal pattern is the duration of the cycle. The daily cycle can be measured in hours. In contrast, the seasonal cycle takes months. In general, this seasonal pattern shows its highest values during summer months and its lowest values during winter months.

This is a first assessment of the data. We will provide a more detailed study in EDA (part II).

Station information data

Data about the location of each of the 98 weather stations is stored in the file station_info.csv. A high-level view of the structure is provided in the table below. For detailed statistical information see this section.

Column number Column name Data type Interpretation
1 stid Character Weather (Mesonet) station name
2 nlat Numeric Latitude
3 elon Numeric Longitud
4 elev Integer Elevation in meter

NOTE: We have created a data.table object solar_stations from stations preserving the content from the original.

An extract of the data (first 5 rows) is shown below.

Finding clusters

The elevation of mesonets could be used to cluster them. That is why, we looked closer to the elevation variable to see if clusters could be derived. From there we observed that there are 8 clusters in which mesonets could be grouped in terms of the elevation. The groups/clusters are shown below:

We reserve this information for a potential use later in the study.

Mapping weather stations

The map below displays the 98 weather stations (Mesonets) in Oklahoma.

Numeric weather predictions (NWP)

The file additional_variables.RData contains 100 weather predictions for each day. According to the explanation in kaggle, the numerical weather prediction data (NWP) “comes from the NOAA/ESRL Global Ensemble Forecast System (GEFS) Reforecast Version 2.” This data, it continues, “include all 11 ensemble members and the forecast timesteps 12, 15, 18, 21, and 24.” A high-level view of the structure is provided in the table below. For detailed statistical information see this section.

Column number Column name Data type Interpretation
1 Date Character Date of interest
2-101 V… Numeric NWP

NOTE: We have created a data.table object solar_extra from extra_vars casting only the date column to date format.

An extract of the data (first 5 rows and columns) is shown below.

Exploring datasets

In this section we explore the datasets by observing existing data types, data completeness and performing univariate and multivariate analysis.

Data types

As explained briefly in the Notes above, we have already explore the data. From our first exploration we observed the following:
- Some data types were not in the correct format: This is the case for date and solar irradiation variables, - All solar irradiation time series have missing data (NA): “missing” values for each variable amounts to 26%.

The first observation was tackled by reformatting these variables to the correct data types. As shown in the table below.

Source Variable name Variable type (original) Variable type (corrected)
solar_dataset.RData Date Character Date
solar_dataset.RData Solar irradiation (cols 2-99) Integer Numeric
additional_variables.RData Date Character Date

Note that we have preserved the original data (we believe this is a good practice). Therefore, to make all modifications explained above we created three new objects (of type data.table as hinted in the notes).

The structure of these three objects is highlighted below. For consistency and readability purposes, we are only showing an extract of the data. Relevant statistics are shown in this section.

solar_irradiation (data.table)

Classes ‘data.table’ and 'data.frame':  5 obs. of  5 variables:
 $ Date: Date, format: "1994-01-01" "1994-01-02" "1994-01-03" "1994-01-04" ...
 $ ACME: num  12384900 11908500 12470700 12725400 10894800
 $ ADAX: num  11930700 9778500 9771900 6466800 11545200
 $ ALTU: num  12116700 10862700 12627300 13065300 8060400
 $ APAC: num  12301200 11666400 12782700 12817500 10379400
 - attr(*, ".internal.selfref")=<externalptr> 

solar_stations (data.table)

Classes ‘data.table’ and 'data.frame':  98 obs. of  4 variables:
 $ stid: chr  "ACME" "ADAX" "ALTU" "APAC" ...
 $ lat : num  34.8 34.8 34.6 34.9 36.1 ...
 $ lng : num  -98 -96.7 -99.3 -98.3 -99.9 ...
 $ elev: int  397 295 416 440 719 758 511 184 304 1267 ...
 - attr(*, ".internal.selfref")=<externalptr> 

solar_extra (data.table)

Classes ‘data.table’ and 'data.frame':  5 obs. of  5 variables:
 $ Date : Date, format: "1994-01-01" "1994-01-02" "1994-01-03" "1994-01-04" ...
 $ V6409: num  0 0.37 0 0 0
 $ V3529: num  0 0.1 0 0 0
 $ V649 : num  0 0.14 0 0 0
 $ V7129: num  0 0 0 0 0
 - attr(*, ".internal.selfref")=<externalptr> 

These objects will be used for the rest of the analysis.

The second observation needs no action. The part of the series that have NA needs to be predicted. Therefore, values for this part of the series will be estimated in the training and prediction sections.

Data completeness

Looking at the original datasets, two datasets have missing values. The solar_dataset.RData has 1796 “missing” values per variable. That is, 26% of the total 6909 observations are missing for each weather station. In contrast, the ratio of missing values for the additional_variables.RData dataset can be separated into two groups according to the percent of data missing as illustrated in the figures below.

Now, we implement a missing plot to get different view of the amount of missing data across our dataset. From the left to the right of the figure below, we observe the ratio of missing data (displayed in the y axis in red) for our attributes (displayed in the x axis). Note that the attributes with the highest ratio of missing data are observed on the left of the figure.

We reserve this information for a potential use later in the study.

Univariate analysis

In this section we aim at learning about the central tendency, distribution and spread of data. Relevant statistics to observe the central tendency are described below.

The table below shows relevant statistics for values corresponding to solar irradiation measurements from all weather stations.

Univariate visualization

To look at the distribution of the data, we used a boxplot. This visualization allows us to display relevant statistics of all 98 variables in one plot. As a reminder, the box captures the middle 50% of the data (from Q1 to Q3). The median is represented by the horizontal line in the box. The whiskers (lines with a T-shape) provides an idea of the dispersion of the data. Data points observed outside these lines, if any, may require further exploration to determine if these points may be consider as outliers.

From the figure below, we observe that most variables are within the same range. The highest and lowest value found in the dataset are highlighted by the blue and green lines, respectively. The red line illustrates the mean of the 98 weather stations. The upper whisker observed for the IDAB weather station is driven by the highest value found in the dataset. This value being 3.9442810^{7}.

Finding outliers

Based on the boxplot above, we observe that the weather station IDAB has a higher length of wiskers. Therefore, we believe it is worthwhile to focus on this distribution to see if within our dataset solar_irradiation outliers exist. As a first step, lets visually analyse this series by means of a boxplot (see below).

After a close examination, we do not observe aspects out of the ordinary. But, lets say that we are still skeptical. Therefore, as a second step, lets look into the whole dataset with a different method. With the help of the function diagnose_outlier in the dlookr library we obtain a diagnosis of our numerical data. For information about this library please refer to the annex I.

Basically, from the table we observe that there are 0 outliers. We beleive this provides sufficient prove that our dataset shows no signs of outliers.

Normality test

In the following, we apply a normality test. From our exploration we found that all our variables show a normal distribution. To exemplify this, we present below the distributions that are at the two boundaries of the spectrum. That is, SALL and KENT.

Multivariate analysis

Below we display the correlation matrix.

ACME ADAX ALTU APAC ARNE BEAV BESS BIXB BLAC BOIS BOWL BREC BRIS BUFF BURB BURN BUTL BYAR CAMA CENT CHAN CHER CHEY CHIC CLAY CLOU COOK COPA DURA ELRE ERIC EUFA FAIR FORA FREE FTCB GOOD GUTH HASK HINT HOBA HOLL HOOK HUGO IDAB JAYX KENT KETC LAHO LANE MADI MANG MARE MAYR MCAL MEDF MEDI MIAM MINC MTHE NEWK NINN NOWA OILT OKEM OKMU PAUL PAWN PERK PRYO PUTN REDR RETR RING SALL SEIL SHAW SKIA SLAP SPEN STIG STIL STUA SULP TAHL TALI TIPT TISH VINI WASH WATO WAUR WEAT WEST WILB WIST WOOD WYNO
ACME 1.000 0.922 0.897 0.978 0.860 0.795 0.924 0.858 0.846 0.742 0.917 0.890 0.890 0.811 0.857 0.906 0.891 0.942 0.881 0.895 0.902 0.858 0.879 0.973 0.806 0.810 0.808 0.824 0.866 0.945 0.883 0.845 0.844 0.832 0.841 0.959 0.752 0.927 0.856 0.940 0.939 0.900 0.778 0.827 0.782 0.792 0.721 0.915 0.886 0.862 0.904 0.926 0.906 0.816 0.870 0.856 0.962 0.785 0.967 0.768 0.849 0.967 0.816 0.887 0.887 0.861 0.952 0.872 0.904 0.822 0.885 0.884 0.906 0.939 0.808 0.859 0.933 0.853 0.786 0.932 0.828 0.899 0.883 0.933 0.813 0.810 0.933 0.873 0.797 0.955 0.915 0.949 0.932 0.761 0.834 0.807 0.851 0.854
ADAX 0.922 1.000 0.824 0.909 0.795 0.745 0.853 0.909 0.836 0.694 0.969 0.866 0.931 0.765 0.865 0.925 0.823 0.977 0.819 0.973 0.928 0.821 0.807 0.925 0.893 0.896 0.885 0.852 0.930 0.899 0.804 0.924 0.801 0.847 0.797 0.890 0.698 0.911 0.916 0.881 0.857 0.817 0.729 0.905 0.856 0.848 0.676 0.891 0.851 0.944 0.948 0.842 0.901 0.774 0.956 0.835 0.888 0.830 0.922 0.847 0.849 0.916 0.851 0.916 0.947 0.924 0.970 0.887 0.910 0.873 0.828 0.881 0.829 0.934 0.884 0.803 0.957 0.887 0.739 0.921 0.910 0.902 0.968 0.979 0.880 0.898 0.852 0.934 0.841 0.942 0.860 0.917 0.866 0.834 0.920 0.887 0.797 0.875
ALTU 0.897 0.824 1.000 0.913 0.867 0.798 0.911 0.761 0.786 0.758 0.815 0.828 0.793 0.804 0.780 0.832 0.888 0.843 0.874 0.800 0.808 0.821 0.891 0.889 0.712 0.718 0.717 0.740 0.780 0.881 0.904 0.758 0.813 0.753 0.827 0.910 0.767 0.846 0.760 0.899 0.934 0.939 0.790 0.740 0.704 0.707 0.737 0.831 0.840 0.768 0.823 0.945 0.823 0.797 0.774 0.805 0.923 0.699 0.890 0.677 0.778 0.881 0.727 0.798 0.787 0.765 0.855 0.787 0.822 0.734 0.866 0.808 0.913 0.869 0.714 0.842 0.834 0.764 0.785 0.839 0.737 0.819 0.787 0.836 0.721 0.715 0.946 0.780 0.714 0.863 0.879 0.890 0.906 0.665 0.742 0.717 0.842 0.769
APAC 0.978 0.909 0.913 1.000 0.878 0.808 0.943 0.850 0.853 0.752 0.903 0.896 0.882 0.827 0.861 0.894 0.911 0.928 0.900 0.879 0.897 0.871 0.896 0.974 0.794 0.797 0.795 0.820 0.852 0.954 0.900 0.832 0.861 0.832 0.859 0.976 0.765 0.931 0.845 0.955 0.956 0.915 0.791 0.814 0.770 0.784 0.731 0.907 0.898 0.848 0.891 0.943 0.906 0.829 0.855 0.868 0.974 0.778 0.972 0.750 0.852 0.967 0.810 0.884 0.877 0.850 0.938 0.872 0.906 0.815 0.903 0.887 0.926 0.929 0.793 0.875 0.926 0.848 0.801 0.929 0.816 0.901 0.869 0.918 0.802 0.794 0.945 0.860 0.792 0.947 0.930 0.943 0.949 0.752 0.819 0.793 0.867 0.850
ARNE 0.860 0.795 0.867 0.878 1.000 0.932 0.937 0.776 0.847 0.852 0.799 0.894 0.805 0.943 0.830 0.777 0.943 0.812 0.974 0.766 0.812 0.923 0.956 0.861 0.692 0.697 0.722 0.783 0.741 0.894 0.934 0.743 0.895 0.803 0.953 0.896 0.874 0.872 0.770 0.916 0.911 0.911 0.909 0.716 0.687 0.732 0.826 0.783 0.913 0.736 0.773 0.915 0.855 0.916 0.757 0.884 0.872 0.731 0.877 0.660 0.841 0.852 0.765 0.820 0.784 0.770 0.816 0.826 0.845 0.754 0.939 0.859 0.917 0.809 0.716 0.943 0.828 0.795 0.920 0.842 0.731 0.853 0.768 0.796 0.732 0.701 0.882 0.747 0.744 0.828 0.929 0.826 0.933 0.682 0.729 0.710 0.971 0.807
BEAV 0.795 0.745 0.798 0.808 0.932 1.000 0.857 0.747 0.815 0.901 0.752 0.850 0.769 0.949 0.799 0.723 0.864 0.760 0.903 0.723 0.765 0.888 0.886 0.797 0.660 0.666 0.704 0.765 0.698 0.830 0.862 0.708 0.848 0.777 0.930 0.821 0.914 0.819 0.743 0.846 0.838 0.841 0.965 0.681 0.664 0.717 0.879 0.723 0.864 0.696 0.721 0.840 0.809 0.906 0.722 0.850 0.796 0.720 0.809 0.634 0.815 0.784 0.748 0.782 0.743 0.739 0.761 0.790 0.799 0.736 0.872 0.820 0.837 0.749 0.698 0.887 0.777 0.767 0.934 0.786 0.705 0.809 0.727 0.743 0.713 0.674 0.813 0.698 0.730 0.765 0.866 0.762 0.858 0.665 0.702 0.687 0.936 0.776
BESS 0.924 0.853 0.911 0.943 0.937 0.857 1.000 0.816 0.859 0.792 0.854 0.910 0.849 0.878 0.853 0.839 0.963 0.872 0.954 0.823 0.863 0.908 0.949 0.927 0.740 0.742 0.758 0.805 0.798 0.945 0.946 0.789 0.898 0.823 0.908 0.958 0.808 0.916 0.809 0.968 0.966 0.940 0.838 0.761 0.724 0.757 0.769 0.848 0.926 0.791 0.835 0.958 0.894 0.874 0.805 0.887 0.938 0.754 0.940 0.702 0.853 0.916 0.790 0.861 0.834 0.812 0.880 0.859 0.888 0.786 0.949 0.885 0.958 0.871 0.751 0.924 0.883 0.826 0.850 0.897 0.773 0.890 0.818 0.859 0.766 0.743 0.931 0.805 0.771 0.894 0.961 0.890 0.980 0.712 0.772 0.748 0.920 0.835
BIXB 0.858 0.909 0.761 0.850 0.776 0.747 0.816 1.000 0.876 0.691 0.928 0.886 0.967 0.770 0.920 0.831 0.793 0.902 0.801 0.899 0.938 0.840 0.773 0.872 0.864 0.853 0.934 0.933 0.852 0.875 0.765 0.930 0.806 0.917 0.801 0.841 0.695 0.914 0.973 0.851 0.808 0.766 0.727 0.849 0.818 0.932 0.678 0.813 0.861 0.878 0.853 0.791 0.925 0.788 0.919 0.864 0.823 0.922 0.876 0.824 0.904 0.857 0.938 0.963 0.947 0.957 0.890 0.933 0.936 0.961 0.809 0.921 0.786 0.842 0.924 0.800 0.930 0.963 0.736 0.907 0.925 0.932 0.919 0.889 0.950 0.881 0.792 0.845 0.932 0.878 0.846 0.830 0.835 0.891 0.901 0.892 0.797 0.944
BLAC 0.846 0.836 0.786 0.853 0.847 0.815 0.859 0.876 1.000 0.732 0.856 0.953 0.891 0.845 0.948 0.781 0.846 0.845 0.869 0.812 0.888 0.927 0.828 0.862 0.755 0.750 0.807 0.915 0.770 0.895 0.819 0.818 0.877 0.932 0.884 0.859 0.744 0.922 0.859 0.884 0.836 0.797 0.784 0.752 0.722 0.834 0.717 0.784 0.939 0.782 0.791 0.824 0.934 0.874 0.814 0.950 0.832 0.852 0.879 0.715 0.963 0.847 0.890 0.917 0.856 0.853 0.845 0.936 0.927 0.866 0.869 0.952 0.827 0.807 0.798 0.870 0.878 0.912 0.801 0.883 0.810 0.937 0.822 0.826 0.830 0.763 0.803 0.774 0.865 0.847 0.898 0.807 0.878 0.771 0.788 0.773 0.872 0.925
BOIS 0.742 0.694 0.758 0.752 0.852 0.901 0.792 0.691 0.732 1.000 0.696 0.766 0.707 0.847 0.727 0.684 0.796 0.709 0.821 0.678 0.699 0.797 0.820 0.736 0.619 0.628 0.662 0.701 0.664 0.763 0.807 0.669 0.764 0.707 0.831 0.761 0.923 0.750 0.693 0.780 0.783 0.804 0.940 0.646 0.638 0.670 0.975 0.678 0.778 0.657 0.680 0.794 0.735 0.810 0.680 0.764 0.745 0.669 0.746 0.599 0.735 0.726 0.690 0.717 0.689 0.687 0.708 0.716 0.729 0.685 0.792 0.743 0.784 0.706 0.657 0.803 0.716 0.704 0.848 0.721 0.665 0.738 0.679 0.693 0.667 0.641 0.775 0.657 0.677 0.709 0.787 0.721 0.789 0.624 0.666 0.654 0.844 0.710
BOWL 0.917 0.969 0.815 0.903 0.799 0.752 0.854 0.928 0.856 0.696 1.000 0.881 0.950 0.774 0.883 0.899 0.825 0.965 0.825 0.952 0.949 0.834 0.808 0.924 0.884 0.880 0.895 0.874 0.903 0.906 0.807 0.928 0.810 0.870 0.806 0.887 0.700 0.925 0.932 0.886 0.854 0.811 0.731 0.883 0.841 0.874 0.676 0.871 0.864 0.921 0.923 0.836 0.919 0.790 0.946 0.849 0.882 0.850 0.921 0.834 0.869 0.913 0.871 0.937 0.959 0.940 0.958 0.905 0.932 0.894 0.834 0.900 0.828 0.911 0.892 0.812 0.969 0.909 0.741 0.931 0.914 0.921 0.957 0.955 0.895 0.888 0.844 0.908 0.862 0.936 0.869 0.899 0.869 0.846 0.913 0.885 0.807 0.897
BREC 0.890 0.866 0.828 0.896 0.894 0.850 0.910 0.886 0.953 0.766 0.881 1.000 0.907 0.884 0.948 0.814 0.898 0.878 0.919 0.836 0.911 0.960 0.880 0.904 0.770 0.769 0.819 0.906 0.795 0.944 0.859 0.836 0.916 0.926 0.923 0.907 0.780 0.959 0.870 0.933 0.887 0.844 0.820 0.777 0.741 0.837 0.747 0.815 0.979 0.804 0.821 0.869 0.961 0.901 0.835 0.967 0.874 0.846 0.925 0.734 0.956 0.889 0.884 0.928 0.877 0.867 0.876 0.946 0.950 0.867 0.920 0.970 0.873 0.843 0.809 0.917 0.909 0.914 0.838 0.921 0.821 0.961 0.844 0.856 0.836 0.781 0.851 0.803 0.860 0.885 0.949 0.846 0.930 0.784 0.808 0.789 0.915 0.926
BRIS 0.890 0.931 0.793 0.882 0.805 0.769 0.849 0.967 0.891 0.707 0.950 0.907 1.000 0.792 0.927 0.854 0.823 0.927 0.830 0.915 0.963 0.859 0.806 0.903 0.862 0.855 0.913 0.923 0.864 0.904 0.797 0.926 0.829 0.915 0.824 0.874 0.714 0.941 0.958 0.881 0.840 0.794 0.748 0.854 0.819 0.905 0.691 0.838 0.886 0.886 0.875 0.822 0.948 0.810 0.924 0.881 0.856 0.897 0.908 0.819 0.913 0.888 0.922 0.977 0.961 0.957 0.917 0.946 0.957 0.936 0.836 0.935 0.817 0.869 0.903 0.824 0.958 0.956 0.755 0.935 0.914 0.952 0.930 0.911 0.925 0.874 0.820 0.864 0.911 0.912 0.875 0.858 0.866 0.865 0.896 0.882 0.820 0.944
BUFF 0.811 0.765 0.804 0.827 0.943 0.949 0.878 0.770 0.845 0.847 0.774 0.884 0.792 1.000 0.828 0.735 0.885 0.780 0.929 0.740 0.793 0.929 0.893 0.817 0.677 0.678 0.717 0.790 0.709 0.856 0.868 0.728 0.884 0.806 0.965 0.843 0.866 0.849 0.762 0.869 0.852 0.844 0.914 0.691 0.670 0.733 0.825 0.740 0.900 0.710 0.735 0.849 0.840 0.941 0.737 0.887 0.815 0.739 0.834 0.642 0.845 0.807 0.770 0.809 0.768 0.760 0.780 0.821 0.830 0.755 0.898 0.851 0.850 0.764 0.710 0.916 0.801 0.792 0.933 0.825 0.720 0.839 0.745 0.761 0.729 0.688 0.820 0.714 0.750 0.789 0.896 0.775 0.881 0.683 0.714 0.699 0.961 0.805
BURB 0.857 0.865 0.780 0.861 0.830 0.799 0.853 0.920 0.948 0.727 0.883 0.948 0.927 0.828 1.000 0.799 0.838 0.869 0.855 0.841 0.916 0.909 0.817 0.873 0.789 0.781 0.850 0.952 0.795 0.899 0.803 0.856 0.864 0.962 0.864 0.864 0.736 0.937 0.901 0.880 0.833 0.791 0.774 0.781 0.750 0.880 0.714 0.799 0.925 0.812 0.811 0.817 0.954 0.852 0.847 0.938 0.834 0.893 0.889 0.745 0.975 0.859 0.929 0.950 0.896 0.891 0.863 0.968 0.953 0.911 0.858 0.968 0.818 0.822 0.836 0.855 0.906 0.953 0.786 0.904 0.843 0.960 0.854 0.850 0.874 0.798 0.805 0.802 0.908 0.865 0.891 0.820 0.872 0.817 0.821 0.808 0.854 0.964
BURN 0.906 0.925 0.832 0.894 0.777 0.723 0.839 0.831 0.781 0.684 0.899 0.814 0.854 0.735 0.799 1.000 0.808 0.927 0.798 0.922 0.858 0.780 0.795 0.895 0.841 0.862 0.806 0.777 0.936 0.862 0.802 0.849 0.766 0.783 0.762 0.871 0.689 0.857 0.841 0.855 0.855 0.830 0.711 0.885 0.840 0.768 0.663 0.884 0.806 0.915 0.967 0.849 0.840 0.740 0.892 0.786 0.891 0.752 0.888 0.808 0.786 0.891 0.775 0.841 0.869 0.844 0.936 0.815 0.848 0.795 0.804 0.820 0.826 0.954 0.812 0.776 0.892 0.810 0.712 0.863 0.840 0.839 0.900 0.943 0.803 0.843 0.874 0.917 0.764 0.903 0.830 0.943 0.845 0.757 0.861 0.829 0.768 0.803
BUTL 0.891 0.823 0.888 0.911 0.943 0.864 0.963 0.793 0.846 0.796 0.825 0.898 0.823 0.885 0.838 0.808 1.000 0.843 0.955 0.792 0.836 0.907 0.949 0.895 0.710 0.716 0.734 0.789 0.768 0.923 0.939 0.761 0.897 0.809 0.912 0.926 0.814 0.894 0.785 0.944 0.938 0.924 0.845 0.736 0.699 0.741 0.772 0.820 0.915 0.762 0.802 0.937 0.873 0.875 0.778 0.880 0.905 0.738 0.909 0.672 0.842 0.886 0.772 0.836 0.804 0.786 0.848 0.839 0.866 0.766 0.946 0.868 0.959 0.840 0.727 0.948 0.856 0.807 0.857 0.869 0.746 0.871 0.791 0.827 0.747 0.718 0.907 0.773 0.752 0.862 0.946 0.861 0.960 0.694 0.746 0.723 0.924 0.817
BYAR 0.942 0.977 0.843 0.928 0.812 0.760 0.872 0.902 0.845 0.709 0.965 0.878 0.927 0.780 0.869 0.927 0.843 1.000 0.836 0.956 0.932 0.836 0.825 0.944 0.871 0.873 0.865 0.849 0.916 0.916 0.826 0.905 0.818 0.852 0.811 0.908 0.713 0.924 0.906 0.900 0.879 0.838 0.743 0.885 0.837 0.837 0.689 0.903 0.865 0.923 0.941 0.864 0.911 0.790 0.935 0.846 0.909 0.820 0.938 0.825 0.857 0.934 0.846 0.916 0.937 0.911 0.982 0.889 0.918 0.864 0.846 0.891 0.851 0.943 0.866 0.821 0.961 0.884 0.751 0.931 0.889 0.910 0.949 0.977 0.866 0.875 0.876 0.922 0.832 0.955 0.879 0.932 0.886 0.815 0.898 0.866 0.813 0.875
CAMA 0.881 0.819 0.874 0.900 0.974 0.903 0.954 0.801 0.869 0.821 0.825 0.919 0.830 0.929 0.855 0.798 0.955 0.836 1.000 0.789 0.840 0.939 0.953 0.886 0.712 0.716 0.741 0.806 0.761 0.918 0.931 0.765 0.915 0.828 0.954 0.917 0.844 0.899 0.792 0.937 0.924 0.911 0.877 0.733 0.699 0.750 0.797 0.807 0.938 0.758 0.796 0.923 0.882 0.919 0.777 0.907 0.893 0.751 0.903 0.677 0.864 0.875 0.787 0.845 0.809 0.792 0.841 0.853 0.873 0.775 0.960 0.883 0.925 0.829 0.735 0.958 0.854 0.820 0.896 0.870 0.750 0.879 0.789 0.820 0.752 0.720 0.890 0.769 0.765 0.854 0.953 0.844 0.952 0.701 0.746 0.726 0.969 0.832
CENT 0.895 0.973 0.800 0.879 0.766 0.723 0.823 0.899 0.812 0.678 0.952 0.836 0.915 0.740 0.841 0.922 0.792 0.956 0.789 1.000 0.908 0.791 0.777 0.896 0.921 0.927 0.891 0.836 0.950 0.865 0.778 0.925 0.774 0.827 0.770 0.858 0.676 0.882 0.911 0.849 0.830 0.790 0.706 0.931 0.886 0.846 0.662 0.867 0.822 0.970 0.953 0.814 0.875 0.753 0.969 0.808 0.862 0.824 0.889 0.876 0.826 0.887 0.838 0.895 0.936 0.917 0.949 0.863 0.885 0.869 0.794 0.855 0.802 0.918 0.897 0.775 0.931 0.873 0.709 0.890 0.920 0.876 0.977 0.965 0.881 0.920 0.828 0.940 0.834 0.913 0.830 0.897 0.835 0.837 0.936 0.906 0.768 0.856
CHAN 0.902 0.928 0.808 0.897 0.812 0.765 0.863 0.938 0.888 0.699 0.949 0.911 0.963 0.793 0.916 0.858 0.836 0.932 0.840 0.908 1.000 0.862 0.813 0.921 0.844 0.837 0.879 0.904 0.856 0.917 0.809 0.904 0.836 0.901 0.826 0.889 0.706 0.951 0.930 0.896 0.854 0.806 0.741 0.837 0.802 0.873 0.682 0.847 0.892 0.874 0.875 0.836 0.950 0.811 0.906 0.881 0.872 0.867 0.925 0.795 0.903 0.905 0.895 0.963 0.945 0.933 0.929 0.936 0.960 0.907 0.848 0.933 0.833 0.878 0.873 0.833 0.965 0.933 0.757 0.946 0.890 0.952 0.915 0.913 0.891 0.849 0.834 0.860 0.885 0.919 0.887 0.871 0.882 0.831 0.875 0.855 0.824 0.927
CHER 0.858 0.821 0.821 0.871 0.923 0.888 0.908 0.840 0.927 0.797 0.834 0.960 0.859 0.929 0.909 0.780 0.907 0.836 0.939 0.791 0.862 1.000 0.893 0.869 0.726 0.725 0.771 0.868 0.757 0.915 0.870 0.788 0.928 0.889 0.965 0.886 0.815 0.918 0.825 0.915 0.877 0.851 0.857 0.736 0.706 0.794 0.777 0.783 0.971 0.760 0.781 0.868 0.915 0.946 0.788 0.963 0.854 0.805 0.891 0.691 0.927 0.858 0.843 0.880 0.829 0.819 0.836 0.901 0.904 0.822 0.928 0.930 0.875 0.808 0.763 0.940 0.862 0.868 0.872 0.878 0.773 0.916 0.798 0.813 0.791 0.735 0.843 0.766 0.818 0.846 0.942 0.818 0.919 0.738 0.763 0.744 0.951 0.883
CHEY 0.879 0.807 0.891 0.896 0.956 0.886 0.949 0.773 0.828 0.820 0.808 0.880 0.806 0.893 0.817 0.795 0.949 0.825 0.953 0.777 0.813 0.893 1.000 0.876 0.696 0.703 0.724 0.772 0.754 0.900 0.946 0.746 0.879 0.788 0.912 0.912 0.837 0.871 0.769 0.927 0.931 0.929 0.865 0.723 0.691 0.726 0.792 0.803 0.895 0.746 0.788 0.934 0.852 0.874 0.764 0.861 0.892 0.722 0.887 0.664 0.822 0.868 0.756 0.817 0.787 0.770 0.832 0.819 0.839 0.749 0.939 0.848 0.931 0.827 0.717 0.920 0.836 0.789 0.870 0.846 0.735 0.845 0.775 0.812 0.730 0.706 0.903 0.759 0.735 0.843 0.927 0.847 0.940 0.692 0.735 0.712 0.931 0.797
CHIC 0.973 0.925 0.889 0.974 0.861 0.797 0.927 0.872 0.862 0.736 0.924 0.904 0.903 0.817 0.873 0.895 0.895 0.944 0.886 0.896 0.921 0.869 0.876 1.000 0.814 0.811 0.817 0.839 0.861 0.956 0.880 0.852 0.858 0.848 0.849 0.960 0.745 0.943 0.868 0.949 0.933 0.888 0.776 0.823 0.780 0.804 0.717 0.905 0.900 0.862 0.897 0.917 0.922 0.825 0.874 0.874 0.952 0.796 0.977 0.763 0.864 0.973 0.829 0.905 0.901 0.872 0.952 0.888 0.923 0.835 0.892 0.901 0.904 0.927 0.814 0.866 0.946 0.868 0.789 0.945 0.838 0.916 0.888 0.930 0.822 0.812 0.919 0.868 0.813 0.959 0.925 0.935 0.938 0.768 0.839 0.812 0.855 0.869
CLAY 0.806 0.893 0.712 0.794 0.692 0.660 0.740 0.864 0.755 0.619 0.884 0.770 0.862 0.677 0.789 0.841 0.710 0.871 0.712 0.921 0.844 0.726 0.696 0.814 1.000 0.935 0.893 0.802 0.900 0.785 0.698 0.900 0.704 0.779 0.702 0.773 0.612 0.811 0.881 0.766 0.744 0.705 0.643 0.920 0.900 0.838 0.607 0.781 0.753 0.934 0.877 0.728 0.809 0.692 0.941 0.749 0.772 0.810 0.805 0.902 0.774 0.800 0.808 0.843 0.896 0.879 0.862 0.807 0.821 0.850 0.716 0.794 0.720 0.831 0.905 0.702 0.860 0.833 0.645 0.819 0.923 0.811 0.928 0.880 0.874 0.948 0.740 0.863 0.814 0.827 0.752 0.809 0.753 0.830 0.941 0.932 0.699 0.809
CLOU 0.810 0.896 0.718 0.797 0.697 0.666 0.742 0.853 0.750 0.628 0.880 0.769 0.855 0.678 0.781 0.862 0.716 0.873 0.716 0.927 0.837 0.725 0.703 0.811 0.935 1.000 0.883 0.790 0.933 0.787 0.703 0.888 0.702 0.776 0.703 0.773 0.622 0.808 0.873 0.770 0.749 0.713 0.653 0.973 0.950 0.825 0.614 0.784 0.751 0.956 0.897 0.736 0.802 0.688 0.937 0.744 0.777 0.803 0.806 0.946 0.771 0.804 0.800 0.832 0.878 0.870 0.863 0.798 0.814 0.838 0.723 0.789 0.725 0.844 0.899 0.703 0.856 0.823 0.651 0.814 0.907 0.807 0.928 0.886 0.864 0.951 0.747 0.883 0.803 0.832 0.753 0.819 0.757 0.829 0.930 0.927 0.700 0.801
COOK 0.808 0.885 0.717 0.795 0.722 0.704 0.758 0.934 0.807 0.662 0.895 0.819 0.913 0.717 0.850 0.806 0.734 0.865 0.741 0.891 0.879 0.771 0.724 0.817 0.893 0.883 1.000 0.881 0.852 0.810 0.716 0.932 0.741 0.851 0.741 0.783 0.654 0.848 0.950 0.789 0.755 0.718 0.689 0.869 0.851 0.938 0.651 0.768 0.794 0.883 0.837 0.739 0.855 0.730 0.929 0.794 0.767 0.910 0.815 0.868 0.837 0.802 0.895 0.901 0.913 0.930 0.851 0.864 0.865 0.941 0.748 0.848 0.731 0.810 0.971 0.739 0.880 0.908 0.688 0.845 0.955 0.862 0.915 0.860 0.971 0.922 0.745 0.828 0.905 0.828 0.783 0.793 0.775 0.933 0.932 0.944 0.740 0.880
COPA 0.824 0.852 0.740 0.820 0.783 0.765 0.805 0.933 0.915 0.701 0.874 0.906 0.923 0.790 0.952 0.777 0.789 0.849 0.806 0.836 0.904 0.868 0.772 0.839 0.802 0.790 0.881 1.000 0.789 0.857 0.760 0.866 0.815 0.965 0.822 0.819 0.704 0.902 0.916 0.836 0.790 0.748 0.742 0.784 0.762 0.924 0.691 0.765 0.878 0.810 0.795 0.773 0.921 0.819 0.852 0.897 0.794 0.947 0.850 0.762 0.952 0.824 0.973 0.943 0.889 0.900 0.841 0.946 0.923 0.949 0.809 0.935 0.773 0.796 0.863 0.811 0.886 0.969 0.747 0.875 0.861 0.929 0.853 0.831 0.907 0.814 0.766 0.787 0.957 0.836 0.844 0.788 0.826 0.852 0.834 0.830 0.811 0.967
DURA 0.866 0.930 0.780 0.852 0.741 0.698 0.798 0.852 0.770 0.664 0.903 0.795 0.864 0.709 0.795 0.936 0.768 0.916 0.761 0.950 0.856 0.757 0.754 0.861 0.900 0.933 0.852 0.789 1.000 0.831 0.760 0.882 0.739 0.783 0.737 0.828 0.663 0.840 0.866 0.819 0.808 0.778 0.688 0.951 0.909 0.802 0.647 0.845 0.783 0.966 0.961 0.797 0.826 0.720 0.930 0.768 0.840 0.782 0.855 0.885 0.782 0.856 0.792 0.845 0.887 0.867 0.916 0.812 0.839 0.823 0.768 0.810 0.781 0.911 0.862 0.744 0.884 0.823 0.687 0.848 0.882 0.830 0.932 0.935 0.839 0.905 0.815 0.927 0.789 0.876 0.797 0.892 0.807 0.793 0.909 0.886 0.739 0.808
ELRE 0.945 0.899 0.881 0.954 0.894 0.830 0.945 0.875 0.895 0.763 0.906 0.944 0.904 0.856 0.899 0.862 0.923 0.916 0.918 0.865 0.917 0.915 0.900 0.956 0.785 0.787 0.810 0.857 0.831 1.000 0.892 0.845 0.898 0.875 0.892 0.959 0.780 0.967 0.865 0.974 0.936 0.894 0.809 0.801 0.760 0.810 0.741 0.867 0.942 0.831 0.863 0.917 0.945 0.866 0.852 0.910 0.935 0.808 0.974 0.747 0.894 0.943 0.845 0.914 0.886 0.865 0.921 0.910 0.940 0.841 0.930 0.932 0.918 0.894 0.804 0.910 0.934 0.882 0.824 0.950 0.824 0.942 0.865 0.898 0.821 0.793 0.908 0.838 0.821 0.931 0.963 0.903 0.963 0.765 0.822 0.796 0.900 0.887
ERIC 0.883 0.804 0.904 0.900 0.934 0.862 0.946 0.765 0.819 0.807 0.807 0.859 0.797 0.868 0.803 0.802 0.939 0.826 0.931 0.778 0.809 0.870 0.946 0.880 0.698 0.703 0.716 0.760 0.760 0.892 1.000 0.742 0.863 0.774 0.885 0.912 0.819 0.859 0.761 0.918 0.939 0.949 0.845 0.722 0.693 0.719 0.784 0.811 0.878 0.749 0.793 0.950 0.839 0.855 0.761 0.843 0.904 0.714 0.887 0.664 0.806 0.870 0.745 0.809 0.783 0.762 0.836 0.804 0.833 0.742 0.911 0.834 0.946 0.832 0.710 0.901 0.830 0.776 0.846 0.841 0.733 0.835 0.772 0.813 0.725 0.702 0.919 0.758 0.728 0.842 0.913 0.858 0.934 0.668 0.731 0.709 0.904 0.785
EUFA 0.845 0.924 0.758 0.832 0.743 0.708 0.789 0.930 0.818 0.669 0.928 0.836 0.926 0.728 0.856 0.849 0.761 0.905 0.765 0.925 0.904 0.788 0.746 0.852 0.900 0.888 0.932 0.866 0.882 0.845 0.742 1.000 0.764 0.850 0.758 0.818 0.668 0.873 0.944 0.822 0.789 0.749 0.697 0.883 0.853 0.891 0.656 0.810 0.815 0.909 0.878 0.771 0.875 0.747 0.950 0.809 0.809 0.872 0.853 0.861 0.840 0.838 0.875 0.911 0.937 0.940 0.894 0.872 0.889 0.912 0.773 0.862 0.762 0.851 0.930 0.759 0.911 0.898 0.697 0.874 0.948 0.882 0.943 0.901 0.925 0.915 0.780 0.867 0.875 0.866 0.810 0.833 0.805 0.874 0.938 0.921 0.758 0.879
FAIR 0.844 0.801 0.813 0.861 0.895 0.848 0.898 0.806 0.877 0.764 0.810 0.916 0.829 0.884 0.864 0.766 0.897 0.818 0.915 0.774 0.836 0.928 0.879 0.858 0.704 0.702 0.741 0.815 0.739 0.898 0.863 0.764 1.000 0.839 0.915 0.875 0.782 0.894 0.794 0.903 0.868 0.840 0.816 0.711 0.683 0.756 0.749 0.827 0.935 0.744 0.767 0.857 0.884 0.890 0.768 0.923 0.845 0.760 0.877 0.665 0.874 0.843 0.797 0.852 0.805 0.791 0.820 0.862 0.878 0.785 0.908 0.893 0.863 0.791 0.733 0.922 0.845 0.826 0.830 0.858 0.748 0.882 0.778 0.798 0.755 0.711 0.833 0.742 0.778 0.828 0.927 0.806 0.904 0.698 0.741 0.721 0.913 0.840
FORA 0.832 0.847 0.753 0.832 0.803 0.777 0.823 0.917 0.932 0.707 0.870 0.926 0.915 0.806 0.962 0.783 0.809 0.852 0.828 0.827 0.901 0.889 0.788 0.848 0.779 0.776 0.851 0.965 0.783 0.875 0.774 0.850 0.839 1.000 0.842 0.833 0.715 0.916 0.900 0.854 0.805 0.764 0.753 0.773 0.745 0.888 0.693 0.770 0.901 0.800 0.794 0.788 0.933 0.835 0.839 0.918 0.809 0.907 0.864 0.744 0.966 0.834 0.941 0.939 0.879 0.885 0.844 0.953 0.935 0.918 0.834 0.949 0.791 0.801 0.836 0.831 0.888 0.954 0.768 0.882 0.839 0.941 0.844 0.830 0.878 0.795 0.779 0.787 0.919 0.843 0.867 0.796 0.844 0.822 0.815 0.805 0.831 0.962
FREE 0.841 0.797 0.827 0.859 0.953 0.930 0.908 0.801 0.884 0.831 0.806 0.923 0.824 0.965 0.864 0.762 0.912 0.811 0.954 0.770 0.826 0.965 0.912 0.849 0.702 0.703 0.741 0.822 0.737 0.892 0.885 0.758 0.915 0.842 1.000 0.876 0.854 0.886 0.790 0.903 0.878 0.862 0.898 0.717 0.689 0.759 0.809 0.770 0.941 0.738 0.764 0.873 0.877 0.961 0.764 0.925 0.844 0.766 0.869 0.668 0.882 0.838 0.801 0.844 0.797 0.788 0.810 0.858 0.867 0.784 0.929 0.889 0.877 0.792 0.733 0.944 0.834 0.826 0.909 0.849 0.745 0.877 0.774 0.791 0.756 0.713 0.841 0.744 0.779 0.822 0.930 0.803 0.914 0.707 0.738 0.720 0.978 0.841
FTCB 0.959 0.890 0.910 0.976 0.896 0.821 0.958 0.841 0.859 0.761 0.887 0.907 0.874 0.843 0.864 0.871 0.926 0.908 0.917 0.858 0.889 0.886 0.912 0.960 0.773 0.773 0.783 0.819 0.828 0.959 0.912 0.818 0.875 0.833 0.876 1.000 0.777 0.933 0.835 0.967 0.963 0.920 0.803 0.792 0.749 0.776 0.740 0.885 0.911 0.824 0.867 0.946 0.909 0.846 0.835 0.878 0.962 0.773 0.969 0.730 0.856 0.951 0.808 0.879 0.866 0.839 0.918 0.874 0.905 0.807 0.918 0.892 0.935 0.905 0.779 0.891 0.913 0.844 0.816 0.923 0.801 0.903 0.850 0.895 0.791 0.774 0.937 0.838 0.788 0.928 0.945 0.921 0.963 0.740 0.801 0.776 0.886 0.849
GOOD 0.752 0.698 0.767 0.765 0.874 0.914 0.808 0.695 0.744 0.923 0.700 0.780 0.714 0.866 0.736 0.689 0.814 0.713 0.844 0.676 0.706 0.815 0.837 0.745 0.612 0.622 0.654 0.704 0.663 0.780 0.819 0.668 0.782 0.715 0.854 0.777 1.000 0.762 0.693 0.796 0.798 0.819 0.946 0.641 0.626 0.664 0.899 0.684 0.795 0.654 0.683 0.806 0.746 0.826 0.675 0.776 0.758 0.667 0.758 0.589 0.745 0.737 0.691 0.724 0.690 0.687 0.714 0.725 0.740 0.683 0.813 0.754 0.797 0.714 0.649 0.826 0.722 0.709 0.868 0.731 0.657 0.752 0.677 0.699 0.664 0.635 0.785 0.657 0.673 0.720 0.806 0.730 0.805 0.616 0.660 0.644 0.867 0.717
GUTH 0.927 0.911 0.846 0.931 0.872 0.819 0.916 0.914 0.922 0.750 0.925 0.959 0.941 0.849 0.937 0.857 0.894 0.924 0.899 0.882 0.951 0.918 0.871 0.943 0.811 0.808 0.848 0.902 0.840 0.967 0.859 0.873 0.894 0.916 0.886 0.933 0.762 1.000 0.901 0.948 0.902 0.856 0.795 0.816 0.776 0.852 0.731 0.861 0.948 0.849 0.865 0.882 0.979 0.864 0.877 0.929 0.904 0.852 0.957 0.767 0.930 0.928 0.889 0.954 0.917 0.901 0.922 0.950 0.976 0.885 0.908 0.964 0.883 0.884 0.840 0.893 0.954 0.924 0.812 0.965 0.857 0.977 0.888 0.904 0.863 0.821 0.874 0.846 0.868 0.928 0.945 0.886 0.934 0.805 0.847 0.826 0.886 0.929
HASK 0.856 0.916 0.760 0.845 0.770 0.743 0.809 0.973 0.859 0.693 0.932 0.870 0.958 0.762 0.901 0.841 0.785 0.906 0.792 0.911 0.930 0.825 0.769 0.868 0.881 0.873 0.950 0.916 0.866 0.865 0.761 0.944 0.794 0.900 0.790 0.835 0.693 0.901 1.000 0.843 0.802 0.763 0.727 0.867 0.839 0.932 0.679 0.813 0.847 0.892 0.864 0.787 0.908 0.779 0.934 0.848 0.819 0.915 0.869 0.840 0.886 0.853 0.926 0.948 0.950 0.964 0.894 0.915 0.921 0.956 0.800 0.902 0.781 0.848 0.938 0.790 0.926 0.946 0.729 0.895 0.943 0.916 0.932 0.895 0.959 0.901 0.792 0.856 0.921 0.875 0.836 0.835 0.826 0.904 0.919 0.913 0.788 0.926
HINT 0.940 0.881 0.899 0.955 0.916 0.846 0.968 0.851 0.884 0.780 0.886 0.933 0.881 0.869 0.880 0.855 0.944 0.900 0.937 0.849 0.896 0.915 0.927 0.949 0.766 0.770 0.789 0.836 0.819 0.974 0.918 0.822 0.903 0.854 0.903 0.967 0.796 0.948 0.843 1.000 0.955 0.917 0.825 0.786 0.748 0.790 0.757 0.863 0.940 0.816 0.854 0.939 0.925 0.873 0.832 0.903 0.941 0.785 0.964 0.727 0.878 0.936 0.821 0.893 0.863 0.842 0.908 0.889 0.921 0.818 0.949 0.914 0.939 0.887 0.784 0.922 0.914 0.857 0.837 0.926 0.804 0.921 0.846 0.884 0.799 0.775 0.922 0.825 0.801 0.919 0.971 0.902 0.982 0.748 0.802 0.778 0.913 0.865
HOBA 0.939 0.857 0.934 0.956 0.911 0.838 0.966 0.808 0.836 0.783 0.854 0.887 0.840 0.852 0.833 0.855 0.938 0.879 0.924 0.830 0.854 0.877 0.931 0.933 0.744 0.749 0.755 0.790 0.808 0.936 0.939 0.789 0.868 0.805 0.878 0.963 0.798 0.902 0.802 0.955 1.000 0.955 0.822 0.770 0.731 0.751 0.761 0.861 0.896 0.798 0.847 0.974 0.880 0.849 0.807 0.859 0.955 0.746 0.939 0.706 0.832 0.925 0.777 0.847 0.829 0.806 0.890 0.843 0.872 0.777 0.919 0.864 0.957 0.888 0.751 0.894 0.879 0.814 0.824 0.889 0.771 0.873 0.819 0.867 0.762 0.746 0.957 0.815 0.759 0.898 0.938 0.910 0.962 0.717 0.773 0.750 0.892 0.820
HOLL 0.900 0.817 0.939 0.915 0.911 0.841 0.940 0.766 0.797 0.804 0.811 0.844 0.794 0.844 0.791 0.830 0.924 0.838 0.911 0.790 0.806 0.851 0.929 0.888 0.705 0.713 0.718 0.748 0.778 0.894 0.949 0.749 0.840 0.764 0.862 0.920 0.819 0.856 0.763 0.917 0.955 1.000 0.836 0.738 0.704 0.711 0.779 0.829 0.860 0.762 0.817 0.977 0.831 0.829 0.769 0.823 0.927 0.706 0.893 0.671 0.790 0.883 0.736 0.800 0.785 0.765 0.849 0.796 0.827 0.736 0.898 0.822 0.948 0.862 0.713 0.877 0.832 0.769 0.831 0.844 0.733 0.829 0.780 0.829 0.724 0.712 0.957 0.779 0.718 0.856 0.902 0.890 0.928 0.673 0.740 0.716 0.882 0.776
HOOK 0.778 0.729 0.790 0.791 0.909 0.965 0.838 0.727 0.784 0.940 0.731 0.820 0.748 0.914 0.774 0.711 0.845 0.743 0.877 0.706 0.741 0.857 0.865 0.776 0.643 0.653 0.689 0.742 0.688 0.809 0.845 0.697 0.816 0.753 0.898 0.803 0.946 0.795 0.727 0.825 0.822 0.836 1.000 0.672 0.655 0.700 0.917 0.707 0.834 0.682 0.708 0.829 0.782 0.871 0.708 0.820 0.779 0.703 0.788 0.621 0.787 0.767 0.728 0.759 0.723 0.721 0.743 0.762 0.773 0.719 0.847 0.791 0.822 0.737 0.683 0.856 0.754 0.744 0.914 0.764 0.690 0.785 0.711 0.727 0.698 0.663 0.805 0.687 0.711 0.747 0.839 0.751 0.837 0.650 0.690 0.676 0.905 0.752
HUGO 0.827 0.905 0.740 0.814 0.716 0.681 0.761 0.849 0.752 0.646 0.883 0.777 0.854 0.691 0.781 0.885 0.736 0.885 0.733 0.931 0.837 0.736 0.723 0.823 0.920 0.973 0.869 0.784 0.951 0.801 0.722 0.883 0.711 0.773 0.717 0.792 0.641 0.816 0.867 0.786 0.770 0.738 0.672 1.000 0.948 0.816 0.630 0.798 0.762 0.960 0.917 0.759 0.806 0.696 0.933 0.751 0.796 0.793 0.819 0.924 0.770 0.819 0.793 0.832 0.875 0.866 0.877 0.799 0.818 0.829 0.741 0.792 0.743 0.865 0.884 0.718 0.862 0.818 0.669 0.821 0.895 0.812 0.927 0.899 0.853 0.935 0.771 0.900 0.794 0.845 0.768 0.841 0.775 0.818 0.923 0.913 0.715 0.798
IDAB 0.782 0.856 0.704 0.770 0.687 0.664 0.724 0.818 0.722 0.638 0.841 0.741 0.819 0.670 0.750 0.840 0.699 0.837 0.699 0.886 0.802 0.706 0.691 0.780 0.900 0.950 0.851 0.762 0.909 0.760 0.693 0.853 0.683 0.745 0.689 0.749 0.626 0.776 0.839 0.748 0.731 0.704 0.655 0.948 1.000 0.798 0.624 0.756 0.726 0.917 0.869 0.721 0.769 0.678 0.895 0.719 0.755 0.776 0.774 0.921 0.740 0.773 0.771 0.798 0.837 0.832 0.832 0.763 0.782 0.807 0.704 0.760 0.709 0.815 0.867 0.688 0.818 0.788 0.644 0.778 0.874 0.777 0.885 0.850 0.831 0.918 0.732 0.848 0.776 0.796 0.733 0.797 0.736 0.795 0.897 0.904 0.690 0.767
JAYX 0.792 0.848 0.707 0.784 0.732 0.717 0.757 0.932 0.834 0.670 0.874 0.837 0.905 0.733 0.880 0.768 0.741 0.837 0.750 0.846 0.873 0.794 0.726 0.804 0.838 0.825 0.938 0.924 0.802 0.810 0.719 0.891 0.756 0.888 0.759 0.776 0.664 0.852 0.932 0.790 0.751 0.711 0.700 0.816 0.798 1.000 0.659 0.744 0.809 0.831 0.797 0.734 0.865 0.752 0.881 0.819 0.754 0.961 0.808 0.803 0.871 0.789 0.936 0.908 0.886 0.907 0.825 0.884 0.876 0.969 0.754 0.869 0.730 0.780 0.916 0.755 0.864 0.931 0.699 0.838 0.905 0.874 0.871 0.825 0.957 0.862 0.736 0.789 0.951 0.807 0.790 0.768 0.777 0.921 0.878 0.886 0.755 0.908
KENT 0.721 0.676 0.737 0.731 0.826 0.879 0.769 0.678 0.717 0.975 0.676 0.747 0.691 0.825 0.714 0.663 0.772 0.689 0.797 0.662 0.682 0.777 0.792 0.717 0.607 0.614 0.651 0.691 0.647 0.741 0.784 0.656 0.749 0.693 0.809 0.740 0.899 0.731 0.679 0.757 0.761 0.779 0.917 0.630 0.624 0.659 1.000 0.664 0.760 0.641 0.664 0.770 0.718 0.792 0.664 0.749 0.722 0.660 0.726 0.584 0.720 0.706 0.682 0.702 0.674 0.672 0.690 0.700 0.712 0.675 0.766 0.725 0.762 0.685 0.645 0.781 0.696 0.691 0.821 0.702 0.653 0.720 0.665 0.676 0.657 0.627 0.750 0.639 0.670 0.688 0.764 0.697 0.766 0.607 0.651 0.642 0.820 0.698
KETC 0.915 0.891 0.831 0.907 0.783 0.723 0.848 0.813 0.784 0.678 0.871 0.815 0.838 0.740 0.799 0.884 0.820 0.903 0.807 0.867 0.847 0.783 0.803 0.905 0.781 0.784 0.768 0.765 0.845 0.867 0.811 0.810 0.827 0.770 0.770 0.885 0.684 0.861 0.813 0.863 0.861 0.829 0.707 0.798 0.756 0.744 0.664 1.000 0.812 0.843 0.884 0.854 0.841 0.743 0.838 0.802 0.896 0.741 0.900 0.735 0.788 0.902 0.765 0.837 0.846 0.818 0.915 0.814 0.846 0.778 0.807 0.822 0.830 0.913 0.770 0.784 0.886 0.799 0.714 0.868 0.795 0.834 0.852 0.905 0.771 0.781 0.870 0.846 0.752 0.902 0.836 0.918 0.851 0.714 0.802 0.773 0.773 0.797
LAHO 0.886 0.851 0.840 0.898 0.913 0.864 0.926 0.861 0.939 0.778 0.864 0.979 0.886 0.900 0.925 0.806 0.915 0.865 0.938 0.822 0.892 0.971 0.895 0.900 0.753 0.751 0.794 0.878 0.783 0.942 0.878 0.815 0.935 0.901 0.941 0.911 0.795 0.948 0.847 0.940 0.896 0.860 0.834 0.762 0.726 0.809 0.760 0.812 1.000 0.790 0.812 0.882 0.943 0.917 0.816 0.964 0.879 0.817 0.921 0.714 0.936 0.886 0.856 0.907 0.858 0.846 0.866 0.922 0.934 0.840 0.935 0.950 0.888 0.835 0.787 0.935 0.894 0.887 0.850 0.909 0.801 0.941 0.827 0.844 0.810 0.760 0.858 0.792 0.833 0.877 0.961 0.843 0.940 0.754 0.788 0.769 0.933 0.901
LANE 0.862 0.944 0.768 0.848 0.736 0.696 0.791 0.878 0.782 0.657 0.921 0.804 0.886 0.710 0.812 0.915 0.762 0.923 0.758 0.970 0.874 0.760 0.746 0.862 0.934 0.956 0.883 0.810 0.966 0.831 0.749 0.909 0.744 0.800 0.738 0.824 0.654 0.849 0.892 0.816 0.798 0.762 0.682 0.960 0.917 0.831 0.641 0.843 0.790 1.000 0.948 0.785 0.841 0.720 0.959 0.780 0.830 0.809 0.855 0.902 0.798 0.854 0.816 0.866 0.912 0.894 0.918 0.831 0.853 0.851 0.764 0.824 0.771 0.898 0.895 0.744 0.899 0.846 0.685 0.858 0.914 0.844 0.959 0.939 0.869 0.935 0.798 0.928 0.815 0.881 0.797 0.874 0.802 0.825 0.936 0.914 0.736 0.826
MADI 0.904 0.948 0.823 0.891 0.773 0.721 0.835 0.853 0.791 0.680 0.923 0.821 0.875 0.735 0.811 0.967 0.802 0.941 0.796 0.953 0.875 0.781 0.788 0.897 0.877 0.897 0.837 0.795 0.961 0.863 0.793 0.878 0.767 0.794 0.764 0.867 0.683 0.865 0.864 0.854 0.847 0.817 0.708 0.917 0.869 0.797 0.664 0.884 0.812 0.948 1.000 0.838 0.850 0.743 0.922 0.793 0.881 0.778 0.891 0.844 0.799 0.893 0.795 0.858 0.894 0.871 0.946 0.829 0.860 0.820 0.800 0.829 0.818 0.950 0.845 0.774 0.906 0.831 0.711 0.874 0.870 0.850 0.931 0.961 0.831 0.878 0.854 0.942 0.787 0.910 0.829 0.930 0.843 0.782 0.891 0.862 0.767 0.820
MANG 0.926 0.842 0.945 0.943 0.915 0.840 0.958 0.791 0.824 0.794 0.836 0.869 0.822 0.849 0.817 0.849 0.937 0.864 0.923 0.814 0.836 0.868 0.934 0.917 0.728 0.736 0.739 0.773 0.797 0.917 0.950 0.771 0.857 0.788 0.873 0.946 0.806 0.882 0.787 0.939 0.974 0.977 0.829 0.759 0.721 0.734 0.770 0.854 0.882 0.785 0.838 1.000 0.859 0.840 0.792 0.847 0.949 0.728 0.922 0.692 0.817 0.911 0.760 0.829 0.811 0.790 0.876 0.823 0.854 0.761 0.912 0.846 0.962 0.882 0.735 0.890 0.861 0.796 0.832 0.871 0.757 0.855 0.804 0.854 0.746 0.732 0.964 0.801 0.742 0.883 0.922 0.908 0.951 0.694 0.760 0.736 0.889 0.802
MARE 0.906 0.901 0.823 0.906 0.855 0.809 0.894 0.925 0.934 0.735 0.919 0.961 0.948 0.840 0.954 0.840 0.873 0.911 0.882 0.875 0.950 0.915 0.852 0.922 0.809 0.802 0.855 0.921 0.826 0.945 0.839 0.875 0.884 0.933 0.877 0.909 0.746 0.979 0.908 0.925 0.880 0.831 0.782 0.806 0.769 0.865 0.718 0.841 0.943 0.841 0.850 0.859 1.000 0.860 0.874 0.933 0.880 0.871 0.937 0.764 0.946 0.906 0.907 0.964 0.919 0.908 0.907 0.965 0.983 0.900 0.890 0.975 0.859 0.865 0.846 0.879 0.946 0.941 0.796 0.951 0.859 0.986 0.883 0.891 0.873 0.818 0.850 0.836 0.885 0.911 0.928 0.863 0.913 0.817 0.842 0.825 0.873 0.948
MAYR 0.816 0.774 0.797 0.829 0.916 0.906 0.874 0.788 0.874 0.810 0.790 0.901 0.810 0.941 0.852 0.740 0.875 0.790 0.919 0.753 0.811 0.946 0.874 0.825 0.692 0.688 0.730 0.819 0.720 0.866 0.855 0.747 0.890 0.835 0.961 0.846 0.826 0.864 0.779 0.873 0.849 0.829 0.871 0.696 0.678 0.752 0.792 0.743 0.917 0.720 0.743 0.840 0.860 1.000 0.747 0.909 0.819 0.761 0.844 0.654 0.874 0.810 0.796 0.830 0.781 0.777 0.793 0.843 0.852 0.778 0.895 0.873 0.847 0.767 0.724 0.914 0.813 0.817 0.876 0.825 0.734 0.859 0.756 0.768 0.744 0.698 0.812 0.722 0.774 0.797 0.901 0.777 0.881 0.695 0.725 0.707 0.946 0.838
MCAL 0.870 0.956 0.774 0.855 0.757 0.722 0.805 0.919 0.814 0.680 0.946 0.835 0.924 0.737 0.847 0.892 0.778 0.935 0.777 0.969 0.906 0.788 0.764 0.874 0.941 0.937 0.929 0.852 0.930 0.852 0.761 0.950 0.768 0.839 0.764 0.835 0.675 0.877 0.934 0.832 0.807 0.769 0.708 0.933 0.895 0.881 0.664 0.838 0.816 0.959 0.922 0.792 0.874 0.747 1.000 0.809 0.832 0.854 0.869 0.896 0.833 0.864 0.858 0.905 0.944 0.935 0.923 0.869 0.886 0.897 0.784 0.859 0.781 0.888 0.934 0.766 0.925 0.888 0.708 0.882 0.955 0.878 0.985 0.938 0.917 0.951 0.804 0.915 0.858 0.890 0.817 0.867 0.819 0.871 0.969 0.943 0.762 0.867
MEDF 0.856 0.835 0.805 0.868 0.884 0.850 0.887 0.864 0.950 0.764 0.849 0.967 0.881 0.887 0.938 0.786 0.880 0.846 0.907 0.808 0.881 0.963 0.861 0.874 0.749 0.744 0.794 0.897 0.768 0.910 0.843 0.809 0.923 0.918 0.925 0.878 0.776 0.929 0.848 0.903 0.859 0.823 0.820 0.751 0.719 0.819 0.749 0.802 0.964 0.780 0.793 0.847 0.933 0.909 0.809 1.000 0.848 0.833 0.893 0.708 0.955 0.860 0.872 0.907 0.851 0.840 0.845 0.928 0.926 0.851 0.901 0.950 0.851 0.813 0.783 0.913 0.880 0.895 0.833 0.890 0.796 0.933 0.817 0.825 0.814 0.755 0.827 0.775 0.849 0.854 0.925 0.816 0.903 0.757 0.781 0.765 0.908 0.911
MEDI 0.962 0.888 0.923 0.974 0.872 0.796 0.938 0.823 0.832 0.745 0.882 0.874 0.856 0.815 0.834 0.891 0.905 0.909 0.893 0.862 0.872 0.854 0.892 0.952 0.772 0.777 0.767 0.794 0.840 0.935 0.904 0.809 0.845 0.809 0.844 0.962 0.758 0.904 0.819 0.941 0.955 0.927 0.779 0.796 0.755 0.754 0.722 0.896 0.879 0.830 0.881 0.949 0.880 0.819 0.832 0.848 1.000 0.748 0.953 0.732 0.828 0.948 0.782 0.855 0.850 0.825 0.922 0.846 0.880 0.785 0.893 0.863 0.928 0.923 0.767 0.866 0.900 0.821 0.790 0.903 0.790 0.876 0.847 0.902 0.773 0.773 0.956 0.847 0.764 0.927 0.917 0.942 0.940 0.721 0.797 0.769 0.856 0.824
MIAM 0.785 0.830 0.699 0.778 0.731 0.720 0.754 0.922 0.852 0.669 0.850 0.846 0.897 0.739 0.893 0.752 0.738 0.820 0.751 0.824 0.867 0.805 0.722 0.796 0.810 0.803 0.910 0.947 0.782 0.808 0.714 0.872 0.760 0.907 0.766 0.773 0.667 0.852 0.915 0.785 0.746 0.706 0.703 0.793 0.776 0.961 0.660 0.741 0.817 0.809 0.778 0.728 0.871 0.761 0.854 0.833 0.748 1.000 0.805 0.780 0.889 0.782 0.954 0.905 0.871 0.891 0.811 0.891 0.874 0.962 0.752 0.876 0.725 0.767 0.889 0.756 0.854 0.936 0.700 0.835 0.877 0.877 0.846 0.808 0.934 0.834 0.727 0.772 0.968 0.798 0.790 0.754 0.773 0.888 0.847 0.855 0.758 0.919
MINC 0.967 0.922 0.890 0.972 0.877 0.809 0.940 0.876 0.879 0.746 0.921 0.925 0.908 0.834 0.889 0.888 0.909 0.938 0.903 0.889 0.925 0.891 0.887 0.977 0.805 0.806 0.815 0.850 0.855 0.974 0.887 0.853 0.877 0.864 0.869 0.969 0.758 0.957 0.869 0.964 0.939 0.893 0.788 0.819 0.774 0.808 0.726 0.900 0.921 0.855 0.891 0.922 0.937 0.844 0.869 0.893 0.953 0.805 1.000 0.759 0.881 0.964 0.839 0.913 0.899 0.874 0.945 0.902 0.937 0.840 0.910 0.917 0.912 0.920 0.812 0.884 0.948 0.878 0.804 0.953 0.834 0.931 0.884 0.924 0.824 0.808 0.918 0.863 0.820 0.955 0.944 0.926 0.953 0.768 0.833 0.807 0.875 0.881
MTHE 0.768 0.847 0.677 0.750 0.660 0.634 0.702 0.824 0.715 0.599 0.834 0.734 0.819 0.642 0.745 0.808 0.672 0.825 0.677 0.876 0.795 0.691 0.664 0.763 0.902 0.946 0.868 0.762 0.885 0.747 0.664 0.861 0.665 0.744 0.668 0.730 0.589 0.767 0.840 0.727 0.706 0.671 0.621 0.924 0.921 0.803 0.584 0.735 0.714 0.902 0.844 0.692 0.764 0.654 0.896 0.708 0.732 0.780 0.759 1.000 0.738 0.754 0.773 0.795 0.837 0.834 0.813 0.762 0.773 0.811 0.682 0.753 0.680 0.790 0.877 0.667 0.813 0.792 0.616 0.772 0.875 0.767 0.882 0.834 0.840 0.927 0.705 0.823 0.777 0.782 0.714 0.768 0.718 0.799 0.900 0.906 0.668 0.766
NEWK 0.849 0.849 0.778 0.852 0.841 0.815 0.853 0.904 0.963 0.735 0.869 0.956 0.913 0.845 0.975 0.786 0.842 0.857 0.864 0.826 0.903 0.927 0.822 0.864 0.774 0.771 0.837 0.952 0.782 0.894 0.806 0.840 0.874 0.966 0.882 0.856 0.745 0.930 0.886 0.878 0.832 0.790 0.787 0.770 0.740 0.871 0.720 0.788 0.936 0.798 0.799 0.817 0.946 0.874 0.833 0.955 0.828 0.889 0.881 0.738 1.000 0.850 0.926 0.937 0.876 0.876 0.851 0.958 0.942 0.901 0.865 0.965 0.819 0.811 0.824 0.867 0.892 0.944 0.797 0.893 0.829 0.951 0.839 0.835 0.862 0.785 0.802 0.787 0.902 0.854 0.895 0.809 0.873 0.806 0.809 0.797 0.868 0.955
NINN 0.967 0.916 0.881 0.967 0.852 0.784 0.916 0.857 0.847 0.726 0.913 0.889 0.888 0.807 0.859 0.891 0.886 0.934 0.875 0.887 0.905 0.858 0.868 0.973 0.800 0.804 0.802 0.824 0.856 0.943 0.870 0.838 0.843 0.834 0.838 0.951 0.737 0.928 0.853 0.936 0.925 0.883 0.767 0.819 0.773 0.789 0.706 0.902 0.886 0.854 0.893 0.911 0.906 0.810 0.864 0.860 0.948 0.782 0.964 0.754 0.850 1.000 0.815 0.889 0.883 0.858 0.942 0.873 0.909 0.820 0.885 0.885 0.901 0.924 0.801 0.853 0.931 0.852 0.778 0.930 0.825 0.902 0.878 0.923 0.809 0.801 0.913 0.864 0.796 0.951 0.914 0.933 0.926 0.758 0.827 0.799 0.843 0.853
NOWA 0.816 0.851 0.727 0.810 0.765 0.748 0.790 0.938 0.890 0.690 0.871 0.884 0.922 0.770 0.929 0.775 0.772 0.846 0.787 0.838 0.895 0.843 0.756 0.829 0.808 0.800 0.895 0.973 0.792 0.845 0.745 0.875 0.797 0.941 0.801 0.808 0.691 0.889 0.926 0.821 0.777 0.736 0.728 0.793 0.771 0.936 0.682 0.765 0.856 0.816 0.795 0.760 0.907 0.796 0.858 0.872 0.782 0.954 0.839 0.773 0.926 0.815 1.000 0.935 0.890 0.905 0.837 0.929 0.909 0.960 0.789 0.914 0.760 0.793 0.877 0.790 0.880 0.964 0.728 0.867 0.872 0.913 0.857 0.830 0.921 0.828 0.756 0.788 0.962 0.829 0.827 0.783 0.809 0.869 0.844 0.843 0.791 0.953
OILT 0.887 0.916 0.798 0.884 0.820 0.782 0.861 0.963 0.917 0.717 0.937 0.928 0.977 0.809 0.950 0.841 0.836 0.916 0.845 0.895 0.963 0.880 0.817 0.905 0.843 0.832 0.901 0.943 0.845 0.914 0.809 0.911 0.852 0.939 0.844 0.879 0.724 0.954 0.948 0.893 0.847 0.800 0.759 0.832 0.798 0.908 0.702 0.837 0.907 0.866 0.858 0.829 0.964 0.830 0.905 0.907 0.855 0.905 0.913 0.795 0.937 0.889 0.935 1.000 0.947 0.943 0.908 0.966 0.975 0.941 0.853 0.957 0.826 0.861 0.888 0.841 0.953 0.969 0.771 0.938 0.901 0.969 0.911 0.898 0.918 0.854 0.824 0.848 0.921 0.901 0.890 0.854 0.879 0.855 0.879 0.865 0.837 0.963
OKEM 0.887 0.947 0.787 0.877 0.784 0.743 0.834 0.947 0.856 0.689 0.959 0.877 0.961 0.768 0.896 0.869 0.804 0.937 0.809 0.936 0.945 0.829 0.787 0.901 0.896 0.878 0.913 0.889 0.887 0.886 0.783 0.937 0.805 0.879 0.797 0.866 0.690 0.917 0.950 0.863 0.829 0.785 0.723 0.875 0.837 0.886 0.674 0.846 0.858 0.912 0.894 0.811 0.919 0.781 0.944 0.851 0.850 0.871 0.899 0.837 0.876 0.883 0.890 0.947 1.000 0.954 0.926 0.913 0.931 0.917 0.815 0.903 0.804 0.881 0.908 0.801 0.957 0.925 0.732 0.921 0.926 0.921 0.949 0.929 0.918 0.891 0.815 0.883 0.885 0.907 0.852 0.865 0.848 0.861 0.913 0.895 0.795 0.910
OKMU 0.861 0.924 0.765 0.850 0.770 0.739 0.812 0.957 0.853 0.687 0.940 0.867 0.957 0.760 0.891 0.844 0.786 0.911 0.792 0.917 0.933 0.819 0.770 0.872 0.879 0.870 0.930 0.900 0.867 0.865 0.762 0.940 0.791 0.885 0.788 0.839 0.687 0.901 0.964 0.842 0.806 0.765 0.721 0.866 0.832 0.907 0.672 0.818 0.846 0.894 0.871 0.790 0.908 0.777 0.935 0.840 0.825 0.891 0.874 0.834 0.876 0.858 0.905 0.943 0.954 1.000 0.900 0.909 0.918 0.933 0.797 0.896 0.783 0.855 0.923 0.786 0.932 0.933 0.726 0.891 0.933 0.913 0.935 0.901 0.936 0.893 0.795 0.875 0.900 0.882 0.834 0.838 0.828 0.877 0.914 0.902 0.786 0.915
PAUL 0.952 0.970 0.855 0.938 0.816 0.761 0.880 0.890 0.845 0.708 0.958 0.876 0.917 0.780 0.863 0.936 0.848 0.982 0.841 0.949 0.929 0.836 0.832 0.952 0.862 0.863 0.851 0.841 0.916 0.921 0.836 0.894 0.820 0.844 0.810 0.918 0.714 0.922 0.894 0.908 0.890 0.849 0.743 0.877 0.832 0.825 0.690 0.915 0.866 0.918 0.946 0.876 0.907 0.793 0.923 0.845 0.922 0.811 0.945 0.813 0.851 0.942 0.837 0.908 0.926 0.900 1.000 0.881 0.915 0.855 0.851 0.887 0.860 0.954 0.853 0.824 0.956 0.874 0.751 0.929 0.879 0.905 0.937 0.979 0.852 0.862 0.887 0.923 0.824 0.961 0.884 0.946 0.893 0.799 0.886 0.855 0.815 0.869
PAWN 0.872 0.887 0.787 0.872 0.826 0.790 0.859 0.933 0.936 0.716 0.905 0.946 0.946 0.821 0.968 0.815 0.839 0.889 0.853 0.863 0.936 0.901 0.819 0.888 0.807 0.798 0.864 0.946 0.812 0.910 0.804 0.872 0.862 0.953 0.858 0.874 0.725 0.950 0.915 0.889 0.843 0.796 0.762 0.799 0.763 0.884 0.700 0.814 0.922 0.831 0.829 0.823 0.965 0.843 0.869 0.928 0.846 0.891 0.902 0.762 0.958 0.873 0.929 0.966 0.913 0.909 0.881 1.000 0.966 0.917 0.860 0.972 0.822 0.840 0.852 0.852 0.927 0.959 0.777 0.922 0.859 0.971 0.876 0.869 0.885 0.819 0.815 0.818 0.907 0.882 0.894 0.834 0.878 0.840 0.840 0.825 0.849 0.967
PERK 0.904 0.910 0.822 0.906 0.845 0.799 0.888 0.936 0.927 0.729 0.932 0.950 0.957 0.830 0.953 0.848 0.866 0.918 0.873 0.885 0.960 0.904 0.839 0.923 0.821 0.814 0.865 0.923 0.839 0.940 0.833 0.889 0.878 0.935 0.867 0.905 0.740 0.976 0.921 0.921 0.872 0.827 0.773 0.818 0.782 0.876 0.712 0.846 0.934 0.853 0.860 0.854 0.983 0.852 0.886 0.926 0.880 0.874 0.937 0.773 0.942 0.909 0.909 0.975 0.931 0.918 0.915 0.966 1.000 0.909 0.884 0.971 0.856 0.870 0.856 0.870 0.955 0.946 0.789 0.952 0.873 0.986 0.896 0.898 0.882 0.829 0.847 0.845 0.893 0.914 0.921 0.869 0.907 0.823 0.856 0.837 0.862 0.950
PRYO 0.822 0.873 0.734 0.815 0.754 0.736 0.786 0.961 0.866 0.685 0.894 0.867 0.936 0.755 0.911 0.795 0.766 0.864 0.775 0.869 0.907 0.822 0.749 0.835 0.850 0.838 0.941 0.949 0.823 0.841 0.742 0.912 0.785 0.918 0.784 0.807 0.683 0.885 0.956 0.818 0.777 0.736 0.719 0.829 0.807 0.969 0.675 0.778 0.840 0.851 0.820 0.761 0.900 0.778 0.897 0.851 0.785 0.962 0.840 0.811 0.901 0.820 0.960 0.941 0.917 0.933 0.855 0.917 0.909 1.000 0.780 0.901 0.756 0.809 0.922 0.778 0.895 0.962 0.719 0.871 0.916 0.907 0.891 0.852 0.964 0.871 0.762 0.813 0.965 0.838 0.818 0.797 0.804 0.912 0.886 0.889 0.777 0.941
PUTN 0.885 0.828 0.866 0.903 0.939 0.872 0.949 0.809 0.869 0.792 0.834 0.920 0.836 0.898 0.858 0.804 0.946 0.846 0.960 0.794 0.848 0.928 0.939 0.892 0.716 0.723 0.748 0.809 0.768 0.930 0.911 0.773 0.908 0.834 0.929 0.918 0.813 0.908 0.800 0.949 0.919 0.898 0.847 0.741 0.704 0.754 0.766 0.807 0.935 0.764 0.800 0.912 0.890 0.895 0.784 0.901 0.893 0.752 0.910 0.682 0.865 0.885 0.789 0.853 0.815 0.797 0.851 0.860 0.884 0.780 1.000 0.889 0.917 0.834 0.740 0.942 0.865 0.824 0.862 0.879 0.760 0.889 0.796 0.829 0.758 0.729 0.883 0.773 0.768 0.863 0.960 0.851 0.957 0.710 0.756 0.732 0.939 0.837
REDR 0.884 0.881 0.808 0.887 0.859 0.820 0.885 0.921 0.952 0.743 0.900 0.970 0.935 0.851 0.968 0.820 0.868 0.891 0.883 0.855 0.933 0.930 0.848 0.901 0.794 0.789 0.848 0.935 0.810 0.932 0.834 0.862 0.893 0.949 0.889 0.892 0.754 0.964 0.902 0.914 0.864 0.822 0.791 0.792 0.760 0.869 0.725 0.822 0.950 0.824 0.829 0.846 0.975 0.873 0.859 0.950 0.863 0.876 0.917 0.753 0.965 0.885 0.914 0.957 0.903 0.896 0.887 0.972 0.971 0.901 0.889 1.000 0.850 0.845 0.837 0.885 0.926 0.944 0.807 0.929 0.849 0.980 0.867 0.869 0.868 0.806 0.836 0.817 0.893 0.889 0.923 0.845 0.903 0.813 0.832 0.815 0.882 0.954
RETR 0.906 0.829 0.913 0.926 0.917 0.837 0.958 0.786 0.827 0.784 0.828 0.873 0.817 0.850 0.818 0.826 0.959 0.851 0.925 0.802 0.833 0.875 0.931 0.904 0.720 0.725 0.731 0.773 0.781 0.918 0.946 0.762 0.863 0.791 0.877 0.935 0.797 0.883 0.781 0.939 0.957 0.948 0.822 0.743 0.709 0.730 0.762 0.830 0.888 0.771 0.818 0.962 0.859 0.847 0.781 0.851 0.928 0.725 0.912 0.680 0.819 0.901 0.760 0.826 0.804 0.783 0.860 0.822 0.856 0.756 0.917 0.850 1.000 0.858 0.727 0.918 0.854 0.794 0.827 0.864 0.749 0.857 0.795 0.839 0.741 0.722 0.932 0.784 0.740 0.868 0.928 0.884 0.951 0.684 0.751 0.727 0.893 0.801
RING 0.939 0.934 0.869 0.929 0.809 0.749 0.871 0.842 0.807 0.706 0.911 0.843 0.869 0.764 0.822 0.954 0.840 0.943 0.829 0.918 0.878 0.808 0.827 0.927 0.831 0.844 0.810 0.796 0.911 0.894 0.832 0.851 0.791 0.801 0.792 0.905 0.714 0.884 0.848 0.887 0.888 0.862 0.737 0.865 0.815 0.780 0.685 0.913 0.835 0.898 0.950 0.882 0.865 0.767 0.888 0.813 0.923 0.767 0.920 0.790 0.811 0.924 0.793 0.861 0.881 0.855 0.954 0.840 0.870 0.809 0.834 0.845 0.858 1.000 0.813 0.806 0.912 0.829 0.744 0.890 0.838 0.863 0.900 0.952 0.809 0.838 0.903 0.911 0.780 0.930 0.860 0.971 0.880 0.765 0.854 0.823 0.797 0.824
SALL 0.808 0.884 0.714 0.793 0.716 0.698 0.751 0.924 0.798 0.657 0.892 0.809 0.903 0.710 0.836 0.812 0.727 0.866 0.735 0.897 0.873 0.763 0.717 0.814 0.905 0.899 0.971 0.863 0.862 0.804 0.710 0.930 0.733 0.836 0.733 0.779 0.649 0.840 0.938 0.784 0.751 0.713 0.683 0.884 0.867 0.916 0.645 0.770 0.787 0.895 0.845 0.735 0.846 0.724 0.934 0.783 0.767 0.889 0.812 0.877 0.824 0.801 0.877 0.888 0.908 0.923 0.853 0.852 0.856 0.922 0.740 0.837 0.727 0.813 1.000 0.731 0.874 0.891 0.680 0.838 0.961 0.852 0.919 0.863 0.950 0.935 0.743 0.835 0.884 0.826 0.775 0.794 0.769 0.910 0.940 0.955 0.732 0.865
SEIL 0.859 0.803 0.842 0.875 0.943 0.887 0.924 0.800 0.870 0.803 0.812 0.917 0.824 0.916 0.855 0.776 0.948 0.821 0.958 0.775 0.833 0.940 0.920 0.866 0.702 0.703 0.739 0.811 0.744 0.910 0.901 0.759 0.922 0.831 0.944 0.891 0.826 0.893 0.790 0.922 0.894 0.877 0.856 0.718 0.688 0.755 0.781 0.784 0.935 0.744 0.774 0.890 0.879 0.914 0.766 0.913 0.866 0.756 0.884 0.667 0.867 0.853 0.790 0.841 0.801 0.786 0.824 0.852 0.870 0.778 0.942 0.885 0.918 0.806 0.731 1.000 0.844 0.821 0.874 0.858 0.745 0.878 0.778 0.802 0.754 0.712 0.861 0.749 0.769 0.833 0.944 0.822 0.930 0.698 0.741 0.721 0.955 0.833
SHAW 0.933 0.957 0.834 0.926 0.828 0.777 0.883 0.930 0.878 0.716 0.969 0.909 0.958 0.801 0.906 0.892 0.856 0.961 0.854 0.931 0.965 0.862 0.836 0.946 0.860 0.856 0.880 0.886 0.884 0.934 0.830 0.911 0.845 0.888 0.834 0.913 0.722 0.954 0.926 0.914 0.879 0.832 0.754 0.862 0.818 0.864 0.696 0.886 0.894 0.899 0.906 0.861 0.946 0.813 0.925 0.880 0.900 0.854 0.948 0.813 0.892 0.931 0.880 0.953 0.957 0.932 0.956 0.927 0.955 0.895 0.865 0.926 0.854 0.912 0.874 0.844 1.000 0.920 0.769 0.961 0.896 0.945 0.937 0.945 0.887 0.864 0.864 0.890 0.869 0.949 0.899 0.905 0.900 0.833 0.890 0.865 0.834 0.913
SKIA 0.853 0.887 0.764 0.848 0.795 0.767 0.826 0.963 0.912 0.704 0.909 0.914 0.956 0.792 0.953 0.810 0.807 0.884 0.820 0.873 0.933 0.868 0.789 0.868 0.833 0.823 0.908 0.969 0.823 0.882 0.776 0.898 0.826 0.954 0.826 0.844 0.709 0.924 0.946 0.857 0.814 0.769 0.744 0.818 0.788 0.931 0.691 0.799 0.887 0.846 0.831 0.796 0.941 0.817 0.888 0.895 0.821 0.936 0.878 0.792 0.944 0.852 0.964 0.969 0.925 0.933 0.874 0.959 0.946 0.962 0.824 0.944 0.794 0.829 0.891 0.821 0.920 1.000 0.752 0.904 0.892 0.948 0.891 0.868 0.930 0.848 0.792 0.824 0.948 0.868 0.862 0.819 0.846 0.875 0.866 0.860 0.818 0.979
SLAP 0.786 0.739 0.785 0.801 0.920 0.934 0.850 0.736 0.801 0.848 0.741 0.838 0.755 0.933 0.786 0.712 0.857 0.751 0.896 0.709 0.757 0.872 0.870 0.789 0.645 0.651 0.688 0.747 0.687 0.824 0.846 0.697 0.830 0.768 0.909 0.816 0.868 0.812 0.729 0.837 0.824 0.831 0.914 0.669 0.644 0.699 0.821 0.714 0.850 0.685 0.711 0.832 0.796 0.876 0.708 0.833 0.790 0.700 0.804 0.616 0.797 0.778 0.728 0.771 0.732 0.726 0.751 0.777 0.789 0.719 0.862 0.807 0.827 0.744 0.680 0.874 0.769 0.752 1.000 0.798 0.691 0.799 0.718 0.733 0.697 0.659 0.803 0.689 0.710 0.760 0.853 0.758 0.851 0.649 0.694 0.672 0.919 0.763
SPEN 0.932 0.921 0.839 0.929 0.842 0.786 0.897 0.907 0.883 0.721 0.931 0.921 0.935 0.825 0.904 0.863 0.869 0.931 0.870 0.890 0.946 0.878 0.846 0.945 0.819 0.814 0.845 0.875 0.848 0.950 0.841 0.874 0.858 0.882 0.849 0.923 0.731 0.965 0.895 0.926 0.889 0.844 0.764 0.821 0.778 0.838 0.702 0.868 0.909 0.858 0.874 0.871 0.951 0.825 0.882 0.890 0.903 0.835 0.953 0.772 0.893 0.930 0.867 0.938 0.921 0.891 0.929 0.922 0.952 0.871 0.879 0.929 0.864 0.890 0.838 0.858 0.961 0.904 0.798 1.000 0.857 0.945 0.893 0.914 0.855 0.825 0.866 0.846 0.849 0.936 0.916 0.890 0.912 0.799 0.851 0.830 0.850 0.903
STIG 0.828 0.910 0.737 0.816 0.731 0.705 0.773 0.925 0.810 0.665 0.914 0.821 0.914 0.720 0.843 0.840 0.746 0.889 0.750 0.920 0.890 0.773 0.735 0.838 0.923 0.907 0.955 0.861 0.882 0.824 0.733 0.948 0.748 0.839 0.745 0.801 0.657 0.857 0.943 0.804 0.771 0.733 0.690 0.895 0.874 0.905 0.653 0.795 0.801 0.914 0.870 0.757 0.859 0.734 0.955 0.796 0.790 0.877 0.834 0.875 0.829 0.825 0.872 0.901 0.926 0.933 0.879 0.859 0.873 0.916 0.760 0.849 0.749 0.838 0.961 0.745 0.896 0.892 0.691 0.857 1.000 0.865 0.941 0.888 0.938 0.941 0.764 0.857 0.880 0.849 0.794 0.821 0.789 0.888 0.956 0.955 0.743 0.869
STIL 0.899 0.902 0.819 0.901 0.853 0.809 0.890 0.932 0.937 0.738 0.921 0.961 0.952 0.839 0.960 0.839 0.871 0.910 0.879 0.876 0.952 0.916 0.845 0.916 0.811 0.807 0.862 0.929 0.830 0.942 0.835 0.882 0.882 0.941 0.877 0.903 0.752 0.977 0.916 0.921 0.873 0.829 0.785 0.812 0.777 0.874 0.720 0.834 0.941 0.844 0.850 0.855 0.986 0.859 0.878 0.933 0.876 0.877 0.931 0.767 0.951 0.902 0.913 0.969 0.921 0.913 0.905 0.971 0.986 0.907 0.889 0.980 0.857 0.863 0.852 0.878 0.945 0.948 0.799 0.945 0.865 1.000 0.888 0.889 0.880 0.824 0.846 0.840 0.895 0.907 0.925 0.863 0.909 0.820 0.849 0.831 0.873 0.954
STUA 0.883 0.968 0.787 0.869 0.768 0.727 0.818 0.919 0.822 0.679 0.957 0.844 0.930 0.745 0.854 0.900 0.791 0.949 0.789 0.977 0.915 0.798 0.775 0.888 0.928 0.928 0.915 0.853 0.932 0.865 0.772 0.943 0.778 0.844 0.774 0.850 0.677 0.888 0.932 0.846 0.819 0.780 0.711 0.927 0.885 0.871 0.665 0.852 0.827 0.959 0.931 0.804 0.883 0.756 0.985 0.817 0.847 0.846 0.884 0.882 0.839 0.878 0.857 0.911 0.949 0.935 0.937 0.876 0.896 0.891 0.796 0.867 0.795 0.900 0.919 0.778 0.937 0.891 0.718 0.893 0.941 0.888 1.000 0.951 0.907 0.933 0.815 0.922 0.854 0.906 0.830 0.879 0.832 0.860 0.953 0.923 0.772 0.872
SULP 0.933 0.979 0.836 0.918 0.796 0.743 0.859 0.889 0.826 0.693 0.955 0.856 0.911 0.761 0.850 0.943 0.827 0.977 0.820 0.965 0.913 0.813 0.812 0.930 0.880 0.886 0.860 0.831 0.935 0.898 0.813 0.901 0.798 0.830 0.791 0.895 0.699 0.904 0.895 0.884 0.867 0.829 0.727 0.899 0.850 0.825 0.676 0.905 0.844 0.939 0.961 0.854 0.891 0.768 0.938 0.825 0.902 0.808 0.924 0.834 0.835 0.923 0.830 0.898 0.929 0.901 0.979 0.869 0.898 0.852 0.829 0.869 0.839 0.952 0.863 0.802 0.945 0.868 0.733 0.914 0.888 0.889 0.951 1.000 0.858 0.880 0.868 0.940 0.819 0.945 0.860 0.936 0.871 0.808 0.901 0.867 0.793 0.857
TAHL 0.813 0.880 0.721 0.802 0.732 0.713 0.766 0.950 0.830 0.667 0.895 0.836 0.925 0.729 0.874 0.803 0.747 0.866 0.752 0.881 0.891 0.791 0.730 0.822 0.874 0.864 0.971 0.907 0.839 0.821 0.725 0.925 0.755 0.878 0.756 0.791 0.664 0.863 0.959 0.799 0.762 0.724 0.698 0.853 0.831 0.957 0.657 0.771 0.810 0.869 0.831 0.746 0.873 0.744 0.917 0.814 0.773 0.934 0.824 0.840 0.862 0.809 0.921 0.918 0.918 0.936 0.852 0.885 0.882 0.964 0.758 0.868 0.741 0.809 0.950 0.754 0.887 0.930 0.697 0.855 0.938 0.880 0.907 0.858 1.000 0.900 0.750 0.824 0.929 0.832 0.795 0.793 0.785 0.935 0.913 0.919 0.752 0.904
TALI 0.810 0.898 0.715 0.794 0.701 0.674 0.743 0.881 0.763 0.641 0.888 0.781 0.874 0.688 0.798 0.843 0.718 0.875 0.720 0.920 0.849 0.735 0.706 0.812 0.948 0.951 0.922 0.814 0.905 0.793 0.702 0.915 0.711 0.795 0.713 0.774 0.635 0.821 0.901 0.775 0.746 0.712 0.663 0.935 0.918 0.862 0.627 0.781 0.760 0.935 0.878 0.732 0.818 0.698 0.951 0.755 0.773 0.834 0.808 0.927 0.785 0.801 0.828 0.854 0.891 0.893 0.862 0.819 0.829 0.871 0.729 0.806 0.722 0.838 0.935 0.712 0.864 0.848 0.659 0.825 0.941 0.824 0.933 0.880 0.900 1.000 0.745 0.866 0.830 0.831 0.759 0.813 0.759 0.864 0.961 0.963 0.710 0.822
TIPT 0.933 0.852 0.946 0.945 0.882 0.813 0.931 0.792 0.803 0.775 0.844 0.851 0.820 0.820 0.805 0.874 0.907 0.876 0.890 0.828 0.834 0.843 0.903 0.919 0.740 0.747 0.745 0.766 0.815 0.908 0.919 0.780 0.833 0.779 0.841 0.937 0.785 0.874 0.792 0.922 0.957 0.957 0.805 0.771 0.732 0.736 0.750 0.870 0.858 0.798 0.854 0.964 0.850 0.812 0.804 0.827 0.956 0.727 0.918 0.705 0.802 0.913 0.756 0.824 0.815 0.795 0.887 0.815 0.847 0.762 0.883 0.836 0.932 0.903 0.743 0.861 0.864 0.792 0.803 0.866 0.764 0.846 0.815 0.868 0.750 0.745 1.000 0.819 0.740 0.891 0.899 0.930 0.926 0.701 0.772 0.746 0.859 0.795
TISH 0.873 0.934 0.780 0.860 0.747 0.698 0.805 0.845 0.774 0.657 0.908 0.803 0.864 0.714 0.802 0.917 0.773 0.922 0.769 0.940 0.860 0.766 0.759 0.868 0.863 0.883 0.828 0.787 0.927 0.838 0.758 0.867 0.742 0.787 0.744 0.838 0.657 0.846 0.856 0.825 0.815 0.779 0.687 0.900 0.848 0.789 0.639 0.846 0.792 0.928 0.942 0.801 0.836 0.722 0.915 0.775 0.847 0.772 0.863 0.823 0.787 0.864 0.788 0.848 0.883 0.875 0.923 0.818 0.845 0.813 0.773 0.817 0.784 0.911 0.835 0.749 0.890 0.824 0.689 0.846 0.857 0.840 0.922 0.940 0.824 0.866 0.819 1.000 0.779 0.890 0.805 0.888 0.813 0.786 0.879 0.845 0.744 0.811
VINI 0.797 0.841 0.714 0.792 0.744 0.730 0.771 0.932 0.865 0.677 0.862 0.860 0.911 0.750 0.908 0.764 0.752 0.832 0.765 0.834 0.885 0.818 0.735 0.813 0.814 0.803 0.905 0.957 0.789 0.821 0.728 0.875 0.778 0.919 0.779 0.788 0.673 0.868 0.921 0.801 0.759 0.718 0.711 0.794 0.776 0.951 0.670 0.752 0.833 0.815 0.787 0.742 0.885 0.774 0.858 0.849 0.764 0.968 0.820 0.777 0.902 0.796 0.962 0.921 0.885 0.900 0.824 0.907 0.893 0.965 0.768 0.893 0.740 0.780 0.884 0.769 0.869 0.948 0.710 0.849 0.880 0.895 0.854 0.819 0.929 0.830 0.740 0.779 1.000 0.812 0.806 0.769 0.789 0.879 0.848 0.851 0.770 0.933
WASH 0.955 0.942 0.863 0.947 0.828 0.765 0.894 0.878 0.847 0.709 0.936 0.885 0.912 0.789 0.865 0.903 0.862 0.955 0.854 0.913 0.919 0.846 0.843 0.959 0.827 0.832 0.828 0.836 0.876 0.931 0.842 0.866 0.828 0.843 0.822 0.928 0.720 0.928 0.875 0.919 0.898 0.856 0.747 0.845 0.796 0.807 0.688 0.902 0.877 0.881 0.910 0.883 0.911 0.797 0.890 0.854 0.927 0.798 0.955 0.782 0.854 0.951 0.829 0.901 0.907 0.882 0.961 0.882 0.914 0.838 0.863 0.889 0.868 0.930 0.826 0.833 0.949 0.868 0.760 0.936 0.849 0.907 0.906 0.945 0.832 0.831 0.891 0.890 0.812 1.000 0.894 0.929 0.907 0.779 0.853 0.825 0.825 0.865
WATO 0.915 0.860 0.879 0.930 0.929 0.866 0.961 0.846 0.898 0.787 0.869 0.949 0.875 0.896 0.891 0.830 0.946 0.879 0.953 0.830 0.887 0.942 0.927 0.925 0.752 0.753 0.783 0.844 0.797 0.963 0.913 0.810 0.927 0.867 0.930 0.945 0.806 0.945 0.836 0.971 0.938 0.902 0.839 0.768 0.733 0.790 0.764 0.836 0.961 0.797 0.829 0.922 0.928 0.901 0.817 0.925 0.917 0.790 0.944 0.714 0.895 0.914 0.827 0.890 0.852 0.834 0.884 0.894 0.921 0.818 0.960 0.923 0.928 0.860 0.775 0.944 0.899 0.862 0.853 0.916 0.794 0.925 0.830 0.860 0.795 0.759 0.899 0.805 0.806 0.894 1.000 0.874 0.974 0.740 0.788 0.766 0.937 0.872
WAUR 0.949 0.917 0.890 0.943 0.826 0.762 0.890 0.830 0.807 0.721 0.899 0.846 0.858 0.775 0.820 0.943 0.861 0.932 0.844 0.897 0.871 0.818 0.847 0.935 0.809 0.819 0.793 0.788 0.892 0.903 0.858 0.833 0.806 0.796 0.803 0.921 0.730 0.886 0.835 0.902 0.910 0.890 0.751 0.841 0.797 0.768 0.697 0.918 0.843 0.874 0.930 0.908 0.863 0.777 0.867 0.816 0.942 0.754 0.926 0.768 0.809 0.933 0.783 0.854 0.865 0.838 0.946 0.834 0.869 0.797 0.851 0.845 0.884 0.971 0.794 0.822 0.905 0.819 0.758 0.890 0.821 0.863 0.879 0.936 0.793 0.813 0.930 0.888 0.769 0.929 0.874 1.000 0.896 0.747 0.837 0.804 0.812 0.816
WEAT 0.932 0.866 0.906 0.949 0.933 0.858 0.980 0.835 0.878 0.789 0.869 0.930 0.866 0.881 0.872 0.845 0.960 0.886 0.952 0.835 0.882 0.919 0.940 0.938 0.753 0.757 0.775 0.826 0.807 0.963 0.934 0.805 0.904 0.844 0.914 0.963 0.805 0.934 0.826 0.982 0.962 0.928 0.837 0.775 0.736 0.777 0.766 0.851 0.940 0.802 0.843 0.951 0.913 0.881 0.819 0.903 0.940 0.773 0.953 0.718 0.873 0.926 0.809 0.879 0.848 0.828 0.893 0.878 0.907 0.804 0.957 0.903 0.951 0.880 0.769 0.930 0.900 0.846 0.851 0.912 0.789 0.909 0.832 0.871 0.785 0.759 0.926 0.813 0.789 0.907 0.974 0.896 1.000 0.731 0.786 0.764 0.923 0.855
WEST 0.761 0.834 0.665 0.752 0.682 0.665 0.712 0.891 0.771 0.624 0.846 0.784 0.865 0.683 0.817 0.757 0.694 0.815 0.701 0.837 0.831 0.738 0.692 0.768 0.830 0.829 0.933 0.852 0.793 0.765 0.668 0.874 0.698 0.822 0.707 0.740 0.616 0.805 0.904 0.748 0.717 0.673 0.650 0.818 0.795 0.921 0.607 0.714 0.754 0.825 0.782 0.694 0.817 0.695 0.871 0.757 0.721 0.888 0.768 0.799 0.806 0.758 0.869 0.855 0.861 0.877 0.799 0.840 0.823 0.912 0.710 0.813 0.684 0.765 0.910 0.698 0.833 0.875 0.649 0.799 0.888 0.820 0.860 0.808 0.935 0.864 0.701 0.786 0.879 0.779 0.740 0.747 0.731 1.000 0.871 0.884 0.702 0.846
WILB 0.834 0.920 0.742 0.819 0.729 0.702 0.772 0.901 0.788 0.666 0.913 0.808 0.896 0.714 0.821 0.861 0.746 0.898 0.746 0.936 0.875 0.763 0.735 0.839 0.941 0.930 0.932 0.834 0.909 0.822 0.731 0.938 0.741 0.815 0.738 0.801 0.660 0.847 0.919 0.802 0.773 0.740 0.690 0.923 0.897 0.878 0.651 0.802 0.788 0.936 0.891 0.760 0.842 0.725 0.969 0.781 0.797 0.847 0.833 0.900 0.809 0.827 0.844 0.879 0.913 0.914 0.886 0.840 0.856 0.886 0.756 0.832 0.751 0.854 0.940 0.741 0.890 0.866 0.694 0.851 0.956 0.849 0.953 0.901 0.913 0.961 0.772 0.879 0.848 0.853 0.788 0.837 0.786 0.871 1.000 0.957 0.738 0.843
WIST 0.807 0.887 0.717 0.793 0.710 0.687 0.748 0.892 0.773 0.654 0.885 0.789 0.882 0.699 0.808 0.829 0.723 0.866 0.726 0.906 0.855 0.744 0.712 0.812 0.932 0.927 0.944 0.830 0.886 0.796 0.709 0.921 0.721 0.805 0.720 0.776 0.644 0.826 0.913 0.778 0.750 0.716 0.676 0.913 0.904 0.886 0.642 0.773 0.769 0.914 0.862 0.736 0.825 0.707 0.943 0.765 0.769 0.855 0.807 0.906 0.797 0.799 0.843 0.865 0.895 0.902 0.855 0.825 0.837 0.889 0.732 0.815 0.727 0.823 0.955 0.721 0.865 0.860 0.672 0.830 0.955 0.831 0.923 0.867 0.919 0.963 0.746 0.845 0.851 0.825 0.766 0.804 0.764 0.884 0.957 1.000 0.719 0.834
WOOD 0.851 0.797 0.842 0.867 0.971 0.936 0.920 0.797 0.872 0.844 0.807 0.915 0.820 0.961 0.854 0.768 0.924 0.813 0.969 0.768 0.824 0.951 0.931 0.855 0.699 0.700 0.740 0.811 0.739 0.900 0.904 0.758 0.913 0.831 0.978 0.886 0.867 0.886 0.788 0.913 0.892 0.882 0.905 0.715 0.690 0.755 0.820 0.773 0.933 0.736 0.767 0.889 0.873 0.946 0.762 0.908 0.856 0.758 0.875 0.668 0.868 0.843 0.791 0.837 0.795 0.786 0.815 0.849 0.862 0.777 0.939 0.882 0.893 0.797 0.732 0.955 0.834 0.818 0.919 0.850 0.743 0.873 0.772 0.793 0.752 0.710 0.859 0.744 0.770 0.825 0.937 0.812 0.923 0.702 0.738 0.719 1.000 0.832
WYNO 0.854 0.875 0.769 0.850 0.807 0.776 0.835 0.944 0.925 0.710 0.897 0.926 0.944 0.805 0.964 0.803 0.817 0.875 0.832 0.856 0.927 0.883 0.797 0.869 0.809 0.801 0.880 0.967 0.808 0.887 0.785 0.879 0.840 0.962 0.841 0.849 0.717 0.929 0.926 0.865 0.820 0.776 0.752 0.798 0.767 0.908 0.698 0.797 0.901 0.826 0.820 0.802 0.948 0.838 0.867 0.911 0.824 0.919 0.881 0.766 0.955 0.853 0.953 0.963 0.910 0.915 0.869 0.967 0.950 0.941 0.837 0.954 0.801 0.824 0.865 0.833 0.913 0.979 0.763 0.903 0.869 0.954 0.872 0.857 0.904 0.822 0.795 0.811 0.933 0.865 0.872 0.816 0.855 0.846 0.843 0.834 0.832 1.000

From the matrix above we observe that pairs of variables show a high correlation. Looking at each pair with the help of the dlookr package, we observe that a large set of pairs have a correlation above abs(0.75). This is confirmed by the correlation plot presented in the next section.

Multivariate visualization

Dimensionality reduction

Principal component analysis

As described in this blog, the goal of PCA is to identify patterns in a data set, and then distill the variables down to their most important features so that the data is simplified without losing important traits. PCA asks if all the dimensions of a data set spark joy and then gives the user the option to eliminate ones that do not.

The main purpose of using this method in our EDA is to implement a more robust implementation of singular value decomposition(SVD). This aids us with data reduction or minimizing the noise within our dataset. This is done by compiling all observations and variables to find within a coordinate axis the different components to project the best fit.

First, we compute the PCs and visualize eigenvalues (scree plot shown below). The figure below shows the percentage of variances explained by each principal component and helps us to determine the number of components to use.

The summary is presented below.

       eigenvalue percentage of variance cumulative percentage of variance
comp 1 82.7196365             84.4077924                          84.40779
comp 2  5.0373496              5.1401527                          89.54795
comp 3  2.5489652              2.6009849                          92.14893
comp 4  1.5543792              1.5861012                          93.73503
comp 5  0.6630583              0.6765901                          94.41162
comp 6  0.5935178              0.6056305                          95.01725

As we saw in the scree plot, the percentage of variances explained by the principal component number 1, is very high for PC1 (84% approx.).

Given that we can explain 93,7% of all the points with 4 different PC, we will focus on the first 4 PC. These 4 principal components factors have to be retained in the exploratory factor analysis.

Some graphic representation to visualize the behavior of these variables and observations are presented below. In this case, we are putting the PC2 in the Y axis and the PC1 in the X axis. With this we see the different signs (+/-) in terms of rotation per principal component.

From the circle of correlations (second graph) we observe that all variables seem to be positively correlated with PC1, however for PC2, there is a 50/50 distribution between the variables.

EDA (part II)

As briefly commented in the first part of this EDA our data (solar_irradiation) is form of a set of time series. In the following, we will present an EDA for this data.

Data classes

Our data is of class numeric. To use this dataset we will cast (convert) it to a time series object ts_solar_irraditation.

Time series main properties

Below we can observe the time series of all mesonets.

Lets examine how related are the successive observations (known as lags) for the ACME series. Below we present the lag plots for one (lag1) and 3 (lag 1-3).

Below we present an EDA summary for the ACME series. In the future, this will be refer as the finger print. On the top part of the graph (shown below), we can observe the time series (ACME). Below it, we can observe the autocorrelation (left) and the partial autocorrelation (rigth).

As describe in Forecasting: Principles and Practice, autocorrelation “autocorrelation measures the linear relationship between lagged values of a time series.” In the correlogram (graph corresponding to the ACF) we can observe the following:
- All lags have correlations that are significantly different from zero (see blue dashed lines).
- There are positive and negative correlations. - Clearly defined peaks and valleys (which can also be described as having a “scalloped” shape according to Rob J. Hyndman in Forecasting: Principles and Practice) caused the seasonality. - There is a small and slow decrease in the ACF as the lags increase (figure below). This is due to the trend.

For explanation about the PACF please check this book.

Time series forecasting

In terms of data splitting, we haven’t splitted the data into train and test sets. It is possible that by using all the data available our model(s) have learned too well the interactions leading to overfitting. However, our knowledge on time series is limited in how to best approach this problem.

Concerning hyper-parameters, we have not modified any hyper-parameter for the models that we have used. Again, we do not fully understand how to modify these hyper-parameters in order to improve the outcome.

We have implemented several methods to predict the 1796 values (requested in the kaggle competition). These methods are introduced below. - ETS
- ARIMA
- NAIVE
- RWDRIFT

We used stl (Seasonal and Trend decomposition using Loess) and stlf (Seasonal and Trend decomposition forecasting) decomposition techniques.

The best result we obtained (based on MAE) was for NAIVE.

Below we provide the code of our best model.

Annex I

This section list libraries we used in the realization of this project.

For data manipulation

data.table

dplyr
Provides a consistent set of verbs (mutate, select, filter, …) that help you solve the most common data manipulation challenges.

Amelia
A program for missing data

For reporting

knitr
Elegant, flexible, and fast dynamic report generation with R

For tables

kable and kableExtra (link)
We used these libraries to create awesome HTML tables.

For data exploration

DataExplorer
This library supports in the scan, analysis and visualization of variables.

dlookr
Supports data diagnosis, exploration, and transformation.

For mapping

leaflet
Provides support in the creation of interactive maps.

For statistical reporting

papeR
We used this library to handle variable labels and to create (complex) summary tables.

For plots

ggplot2
For graphics creation

scales Graphical scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends.

gtable, grid, egg, gridExtra (link)
Used to layout multiple plots in a page. See explanation in link.

corrplot
To display a graphical correlation matrix (correlation plot) for fast data understanding.

RColorBrewer
Provides nice looking color palettes

Factoextra
Visualization of multivariate data analysis results

For prediction

caret
Streamsline the process for creating predictive models

forecast
Forecasting functions for time series and linear models

For time series

tseries
Time series analysis

Annex II

This section list useful links used in the realization of this project.

For EDA: data explorer

For plotting: ablines, ggplot, ggplot2, ggplot3

For RMarkdown: cross-referencing, notebook, notebook2

For time series: fpp2

For machine learning: mlbench

For dimentionality reduction: PCA

For solving issues in respect to compilers: solution for installing Amelia

For understanding the state of r packages for data exploration article

LS0tCnRpdGxlOiAiR3JvdXAgQXNzaWdubWVudCBQUk9HUkFNTUlORyAtIFIgTUJELUVOLTIwMjBBLTEiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIHRvY19jb2xsYXBzZWQ6IHllcwogICAgdG9jX2RlcHRoOiA0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKSW4gdGhlIGZvbGxvd2luZyB3ZSBleHBsYWluIHRoZSBzdGVwcyB0YWtlbiBmb3IgdGhlICJQUk9HUkFNTUlORyBSIFdPUktHUk9VUCBQUk9KRUNUIiBvZiBHcm91cCAyLjEuIAoKIyBPYmplY3RpdmVzIHsjb2JqfQoKVGhlIG9iamVjdGl2ZXMgb2YgdGhlIHByb2plY3QgYXJlOiAgCjEuIEV4cGxvcmUsIGRlc2NyaWJlIGFuZCBhbmFseXplIHRoZSBkYXRhOiBGb3IgdGhhdCB3ZSBwZXJmb3JtZWQgYW4gRURBICAKMi4gUmVwb3J0IGZpbmRpbmdzIGZyb20gdGhlIEVEQTogRm9yIHRoYXQgd2UgcHJlcGFyZWQgdGhpcyBSIE5vdGVib29rICAKMy4gVHJhaW4gYSBNTCBtb2RlbDogRm9yIHRoYXQgd2UgdXNlZCBhdmFpbGFibGUgZGF0YXNldHMgYW5kIGNvbXBsZW1lbnRlZCBpdCB3aXRoIGRhdGEgY3JlYXRlZCBieSB1cyAgICAKNC4gTWFrZSBwcmVkaWN0aW9ucyBhbmQgc3VibWl0IHRoZW0gdG8gS2FnZ2xlOiBUaGlzIG9iamVjdGl2ZSBpcyBwYXJ0IG9mIHRoZSBvbmUgYWJvdmUuICAKCiMgUHJvYmxlbSBkZWZpbml0aW9uIHsjcHJvYmxlbX0KCkZvciB0aGlzIHByb2plY3Qgd2Ugd2lsbCB3b3JrIHdpdGggYSBwcmVwcm9jZXNzZWQgZGF0YXNldCBvcmlnaW5hdGluZyBmcm9tIHRoZSAiQU1TIDIwMTMtMjAxNCBTb2xhciBFbmVyZ3kgUHJlZGljdGlvbiBDb250ZXN0IiBbbGlua10oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9jL2Ftcy0yMDE0LXNvbGFyLWVuZXJneS1wcmVkaWN0aW9uLWNvbnRlc3Qvb3ZlcnZpZXcvZXZhbHVhdGlvbikuIEFzIGRlc2NyaWJlZCBpbiBrYWdnbGUsIHRoZSBvYmplY3RpdmUgb2YgdGhlIGNvbnRlc3QgaXMgdG8gImRpc2NvdmVyIHdoaWNoIHN0YXRpc3RpY2FsIGFuZCBtYWNoaW5lIGxlYXJuaW5nIHRlY2huaXF1ZXMgcHJvdmlkZSB0aGUgYmVzdCBzaG9ydCB0ZXJtIHByZWRpY3Rpb25zIG9mIHNvbGFyIGVuZXJneSBwcm9kdWN0aW9uLiIgQ29udGVzdGFudHMsIGl0IGNvbnRpbnVlcywgIndpbGwgcHJlZGljdCB0aGUgdG90YWwgZGFpbHkgaW5jb21pbmcgc29sYXIgZW5lcmd5IGF0IDk4IE9rbGFob21hIE1lc29uZXQgc2l0ZXMsIHdoaWNoIHdpbGwgc2VydmUgYXMgInNvbGFyIGZhcm1zIiBmb3IgdGhlIGNvbnRlc3QuIiBUaGUgZGF0YXNldHMgdXNlZCBmb3IgdGhpcyBwcm9qZWN0IGlzIGV4cGxvcmVkIGJlbG93LgoKIyBMaWJyYXJpZXMgeyNsaWJyYXJpZXN9CgpUbyBhY2NvbXBsaXNoIGFsbCBvYmplY3RpdmVzIHdlJ2xsIGJlIHV0aWxpemluZyB0aGUgZm9sbG93aW5nIGxpYnJhcmllcy4gSW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbGlicmFyaWVzIGFuZCBtYXRlcmlhbCB1c2VkIGluIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHByb2plY3QgcGxlYXNlIGNoZWNrIFthbm5leCBJXSgjYW5uZXgtMSkgYW5kIFthbm5leCBJSV0oI2FubmV4LTIpLCByZXNwZWN0aXZlbHkuIAoKYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQoKIyBMb2FkaW5nIGxpYnJhcmllcwpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShrbml0cikKbGlicmFyeShwYXBlUikKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShEYXRhRXhwbG9yZXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZGxvb2tyKQpsaWJyYXJ5KGd0YWJsZSkKbGlicmFyeShncmlkKQpsaWJyYXJ5KGVnZykKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZmFjdG9leHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeShjYXJldCkKbGlicmFyeShBbWVsaWEpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShGYWN0b01pbmVSKQpsaWJyYXJ5KHVyY2EpCmBgYAoKIyBFREEgKHBhcnQgSSkgeyNlZGEtMX0KCiMjIERhdGFzZXRzIHsjZGF0YX0KCmBgYHtyIGxvYWRpbmctZmlsZXMsIGluY2x1ZGU9RkFMU0V9CiMgTG9hZGluZyBhbGwgcmVsZXZhbnQgZmlsZXMKIyMgY3JlYXRpbmcgcGF0aCB0byBmb2xkZXIgLSBlYXN5IHRvIGNoYW5nZSBsYXRlcgpmb2xkZXJfcGF0aCA8LSAiL1VzZXJzL2VyaXZlcm8vRG9jdW1lbnRzL01CRFwgSUUvdDEvUlwgUFJPR1JBTU1JTkcvZ3JvdXBfYXNzaWdubWVudC9wcm9qZWN0KDEpLyI7CiMjIGFzc2lnbmluZyB0byB2YXJpYWJsZQpzb2xhciA8LSByZWFkUkRTKGZpbGUucGF0aChmb2xkZXJfcGF0aCwic29sYXJfZGF0YXNldC5SRGF0YSIpKTsgIyBjcmVhdGVkIGFzIGR0CnN0YXRpb25zIDwtIGFzLmRhdGEudGFibGUocmVhZC5jc3YoZmlsZS5wYXRoKGZvbGRlcl9wYXRoLCJzdGF0aW9uX2luZm8uY3N2IikpKTsgIyBjcmVhdGVkIGFzIGR0CmV4dHJhX3ZhcnMgPC0gcmVhZFJEUyhmaWxlLnBhdGgoZm9sZGVyX3BhdGgsImFkZGl0aW9uYWxfdmFyaWFibGVzLlJEYXRhIikpOyAjIGNyZWF0ZWQgYXMgZHQKYGBgCgpXZSB3ZXJlIHByb3ZpZGVkIHdpdGggdGhyZWUgKDMpIGRhdGFzZXRzOiAgCi0gYHNvbGFyX2RhdGFzZXQuUkRhdGFgOiBUaGlzIGZpbGUgY29udGFpbnMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB3ZWF0aGVyIHN0YXRpb25zIG92ZXIgc29sYXIgaXJyYWRpYXRpb24uICAgIAotIGBzdGF0aW9uX2luZm8uY3N2YDogVGhpcyBmaWxlIGNvbnRhaW5zIHJlbGV2YW50IGluZm9ybWF0aW9uIG92ZXIgdGhlIGxvY2FsaXphdGlvbiBvZiB0aGUgd2VhdGhlciBzdGF0aW9ucy4gICAKLSBgYWRkaXRpb25hbF92YXJpYWJsZXMuUkRhdGFgOiBUaGlzIGZpbGUgY29udGFpbnMgbnVtZXJpY2FsIHdlYXRoZXIgcHJlZGljdGlvbnMgKE5XUCkgcmVsZXZhbnQgdG8gdGhlIHBlcmlvZCBpbiBvYnNlcnZhdGlvbi4KCkFsbCB0aGlzIGRhdGFzZXRzIGhhdmUgYmVlbiBsb2FkZWQgYXMgYGRhdGEudGFibGVgIG9iamVjdHMgYXMgc2hvd24gYmVsb3cuICAKLSBjbGFzcyBvZiAqKnNvbGFyKiogb2JqZWN0OiBgciBjbGFzcyhzb2xhcilgLiAgCi0gY2xhc3Mgb2YgKipzdGF0aW9ucyoqIG9iamVjdDogYHIgY2xhc3Moc3RhdGlvbnMpYC4gIAotIGNsYXNzIG9mICoqZXh0cmFfdmFycyoqIG9iamVjdDogYHIgY2xhc3MoZXh0cmFfdmFycylgLgoKIyMgVW5kZXJzdGFuZGluZyB0aGUgZGF0YXNldHMgeyN1bmRlcnN0YW5kaW5nfQoKIyMjIFNvbGFyIGlycmFkaWF0aW9uIGRhdGEgeyNzb2xhci1kYXRhfQoKVGhpcyBkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBgc29sYXJfZGF0YXNldC5SRGF0YWAuIE5vdGUgdGhhdCB0aGlzIGZpbGUgaGFzIGJlZW4gcHJlLXByb2Nlc3NlZCwgaG93ZXZlciwgd2UgZG8gbm90IGhhdmUgdGhlIHN0ZXBzIHRha2VuIGZvciB0aGUgcHJlLXByb2Nlc3NpbmcuIFRoZXJlZm9yZSwgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSB3aXRoaW4gdGhpcyBmaWxlIGlzIGxpbWl0ZWQuIFRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgd2lsbCBiZSB1c2VkIGFzIGlzLiAKCk9uIHRoZSBzdHJ1Y3R1cmUsIHRoZSBkYXRhc2V0IGhhcyBgciBkaW0oc29sYXIpWzFdYCBvYnNlcnZhdGlvbnMgYW5kIGByIGRpbShzb2xhcilbMl1gIHZhcmlhYmxlcy4gRWFjaCBvYnNlcnZhdGlvbiBjb3JyZXNwb25kIHRvIGEgZGF5LiBUaGUgdG90YWwgcGVyaW9kIGNvdmVyZWQgaXMgMTk5NC0wMS0wMSB0byAyMDEyLTExLTMwLiBEYWlseSBpbmNvbWluZyBzb2xhciBlbmVyZ3kgbWVhc3VyZW1lbnRzLCB3aGljaCBhcmUgdGhlIHZhbHVlcyBvZiBpbnRlcmVzdCwgYXJlIHByb3ZpZGVkIGZyb20gMTk5NC0wMS0wMSB0byAyMDA3LTEyLTMxIChib3RoIGluY2x1ZGVkKSBmb3IgOTggd2VhdGhlciBzdGF0aW9ucy4gRWFjaCB2YWx1ZSByZWZlcnMgdG8gdGhlIHRvdGFsIGRhaWx5IGluY29taW5nIHNvbGFyIGVuZXJneSBpbiAoJEovbV4yJCkgYXQgZWFjaCBzaXRlICh3ZWF0aGVyIHN0YXRpb24pIG1lYXN1cmVkIGV2ZXJ5IDUgbWludXRlcyBhbmQgc3VtbWVkIGZyb20gc3VucmlzZSB0byAyMzo1NSBVVEMuIEFzIHN0YXRlZCBpbiB0aGUgW2RhdGEgZGVzY3JpcHRpb25dKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vYy9hbXMtMjAxNC1zb2xhci1lbmVyZ3ktcHJlZGljdGlvbi1jb250ZXN0L2RhdGEpIHNlY3Rpb24gb2YgdGhlIGthZ2dsZSBjb21wZXRpdGlvbi4KRnJvbSAyMDA4LTAxLTAxIHRvIDIwMTItMTEtMzAsIGhvd2V2ZXIsIHRoZXNlIG1lYXN1cmVtZW50cyB3ZXJlIG5vdCBwcm92aWRlZCB3aXRoIHRoZSBvYmplY3RpdmUgdG8gdXNlIHRoZSBhYm92ZSBkZXNjcmliZWQgc2V0IHRvIHByZWRpY3QgdGhlbS4gQSBoaWdoLWxldmVsIHZpZXcgb2YgdGhlIHN0cnVjdHVyZSBpcyBwcm92aWRlZCBpbiB0aGUgdGFibGUgYmVsb3cuIEZvciBkZXRhaWxlZCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBzZWUgW3RoaXMgc2VjdGlvbl0oI2V4cGxvcmF0aW9uKS4KCnxDb2x1bW4gbnVtYmVyfENvbHVtbiBuYW1lfERhdGEgdHlwZXxJbnRlcnByZXRhdGlvbnwKfC0tLXwtLS18LS0tfC0tLXwKfDF8RGF0ZXxDaGFyYWN0ZXJ8RGF5IG9mIGludGVyZXN0fAp8Mi05OXxOYW1lIG9mIHdlYXRoZXIgc3RhdGlvbnxJbnRlZ2VyfFJlYWwgdmFsdWVzIG9mIHNvbGFyIHByb2R1Y3Rpb24gcmVjb3JkZWQgcGVyIGRheXwKfDEwMC00NTZ8V2VhdGhlciBwcmVkaWN0b3JzfE51bWVyaWN8VmFyaWFibGVzIGNyZWF0ZWQgZnJvbSBkaWZmZXJlbnQgd2VhdGhlciBwcmVkaWN0b3JzIGdpdmVuIGluIHRoZSBLYWdnbGUgY29tcGV0aXRpb24gYXMgdGhlIHJlc3VsdCBvZiBhIFBDQXwKCkFuIGV4dHJhY3Qgb2YgdGhlIGZpbGUgKGZpcnN0IDUgcm93cykgaXMgc2hvd24gYmVsb3cuIFRoZSBleHRyYWN0IHNob3dzIHRoZSBmaXJzdCBjb2x1bW4gb2YgZWFjaCB0eXBlLiBUaGF0IGlzLCBhIHZhcmlhYmxlIGZvciB0aGUgZGF0ZSwgb25lIG9mIHRoZSA5OCB2YXJpYWJsZXMgZm9yIHRoZSB3ZWF0aGVyIHN0YXRpb24gbWVhc3VyZW1lbnRzIGFuZCwgb25lIG9mIHRoZSAzNTcgdmFyaWFibGVzIGZvciB0aGUgcmVzdWx0cyBvZiBhIHByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgKFBDQSkuCgpgYGB7ciBzb2xhcn0KaGVhZChzb2xhcilbMTo1LGMoMSwyLDEwMCldICMgZGlzcGxheWluZyB0aGUgZmlyc3QgY29sdW1uIG9mIGVhY2ggdHlwZQpgYGAKCgpgYGB7ciBzb2xhci1pcnJhZGlhdGlvbn0Kc29sYXJfaXJyYWRpYXRpb24gPC0gc29sYXJbMTo1MTEzLDE6OTldOyAjIHJlYWwgaXJyYWRpYXRpb24gZnJvbSA5OCBzdGF0aW9ucwoKIyMgY2FzdGluZyB0byBkYXRlCnNvbGFyX2lycmFkaWF0aW9uJERhdGUgPC0gYXMuRGF0ZS5jaGFyYWN0ZXIoc29sYXJfaXJyYWRpYXRpb24kRGF0ZSwgZm9ybWF0ID0gYygiJVklbSVkIikpOyAjY2FzdGluZyB2YXJpYWJsZSB0byBkYXRlIGZvcm1hdAoKIyMgY2FzdGluZyB0byBudW1lcmljCnZlY19uYW1lc19udW0gPC0gY29sbmFtZXMoc29sYXJfaXJyYWRpYXRpb24pWy0xXTsgIyBleGNsdWRpbmcgZGF0ZSBjb2x1bW4Kc29sYXJfaXJyYWRpYXRpb25bLCh2ZWNfbmFtZXNfbnVtKSA6PSBsYXBwbHkoLlNELCBhcy5udW1lcmljKSwgLlNEY29scyA9IHZlY19uYW1lc19udW1dICMgY2FzdGluZyB0byBudW1lcmljIGluZGV4aW5nIGJ5IG5hbWUKYGBgCgoqKk5PVEUqKjogV2UgaGF2ZSBjcmVhdGVkIGEgZGF0YS50YWJsZSBvYmplY3QgYHNvbGFyX2lycmFkaWF0aW9uYCBmcm9tIGBzb2xhcmAgKGFsc28gYSBkYXRhLnRhYmxlKSB3aXRoIHRoZSBmb2xsb3dpbmcgbW9kaWZpY2F0aW9uczogIAotIENhc3RpbmcgZGF0ZSBjb2x1bW4gdG8gZGF0ZSBmb3JtYXQgYW5kIHNvbGFyIGlycmFkaWF0aW9uIGRhdGEgKGNvbHVtbnMgMi05OSkgdG8gbnVtZXJpYywgIAotIERyb3BwaW5nIGFsbCBQQyBjb2x1bW5zIGFuZCByb3dzIHdpdGggTkEuCgoKCgoKCiMjIyMgQSB0aW1lIHNlcmllcyBkYXRhIHsjdGltZS1zZXJpZXN9CgpUaGUgc29sYXIgaXJyYWRpYXRpb24gZGF0YSByZXByZXNlbnRzIGEgdGltZSBzZXJpZXMgb2Ygc29sYXIgaXJyYWRpYXRpb24gdmFsdWVzIG1lYXN1cmVkIGF0IGVhY2ggTWVzb25ldCAod2VhdGhlciBzdGF0aW9uKS4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyB0aGUgdGltZSBzZXJpZXMgZm9yIG9uZSB3ZWF0aGVyIHN0YXRpb24gKEFDTUUpLiBGcm9tIHRoZSBmaWd1cmUgaXQgY2FuIGJlIGFwcHJlY2lhdGVkIHRoZSB1cHMgYW5kIGRvd25zIChjeWNsZXMpIGNoYXJhY3RlcmlzdGljIG9mIHNvbGFyIGlycmFkaWF0aW9uLgoKYGBge3IgdHMtc2Vhc29uYWxpdHl9CnRpbWVfc2VyaWVzX21lc29uZXQgPC0gZ2dwbG90KHNvbGFyX2lycmFkaWF0aW9uLCBhZXMoeCA9IHNvbGFyX2lycmFkaWF0aW9uJERhdGUsIHkgPSBzb2xhcl9pcnJhZGlhdGlvbiRBQ01FKSkgICsgZ2VvbV9saW5lKCkgCnRpbWVfc2VyaWVzX21lc29uZXQgPC0gdGltZV9zZXJpZXNfbWVzb25ldCArIGxhYnModGl0bGUgPSAiU2Vhc29uYWxpdHkgLSBmdWxsIHRpbWUgc2VyaWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQUNNRSBtZXNvbmV0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJzb3VyY2U6IHNvbGFyX2lycmFkaWF0aW9uIChkdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAiSXJyYWRpYXRpb24iKSAKdGltZV9zZXJpZXNfbWVzb25ldCA8LSB0aW1lX3Nlcmllc19tZXNvbmV0ICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIiwgc2l6ZSA9ICIxMCIsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpKSAgCnRpbWVfc2VyaWVzX21lc29uZXQgPC0gdGltZV9zZXJpZXNfbWVzb25ldCArIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlWS0lbS0lZCIsIGRhdGVfYnJlYWtzID0gIjczMCBkYXlzIikKdGltZV9zZXJpZXNfbWVzb25ldApgYGAKCkluIHJlYWxpdHksIHRoZXNlIGN5Y2xlcyBoYXBwZW4gZHVyaW5nIHRoZSBkYXksIHdoZXJlIHRoZSBwZWFrIGlzIG5vcm1hbGx5IG9ic2VydmVkIGNsb3NlIHRvIG5vb24gYW5kIHRoZSB2YWxsZXlzIHNob3dpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF5IChlYXJseSBtb3JuaW5nKSBhbmQgYXQgdGhlIGVuZCAobGF0ZSBhZnRlcm5vb24pLiBUaGUgZGF0YSB3ZSBoYXZlIHJlcHJlc2VudHMgdGhlIGFjY3VtdWxhdGVkIHJhZGlhdGlvbiBwZXIgZGF5IHBlciBzdGF0aW9uLiBXaXRoIHRoaXMgZGF0YSB3ZSBjYW5ub3Qgb2JzZXJ2ZSB0aGUgZGFpbHkgY3ljbGUgYnV0IG9ubHkgdGhlIHNlYXNvbmFsIG9uZS4gSW5kZWVkLCBzb2xhciBpcnJhZGlhdGlvbiBhbHNvIGhhcyBzZWFzb25hbGl0eS4gIAoKVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyB0aGUgc2Vhc29uYWwgcGF0dGVybiBlbWJlZGRlZCBpbiB0aGUgc29sYXIgaXJyYWRpYXRpb24gdGltZSBzZXJpZXMgb2YgdGhlIEFDTUUgd2VhdGhlciBzdGF0aW9uLiBUaGUgZmlndXJlIGRpc3BsYXlzIHR3byB5ZWFycyB3b3J0aCBvZiBvYnNlcnZhdGlvbnMgKGZyb20gMjAwMC0wMS0wMSB0byAyMDAxLTEyLTMxKS4gTm90ZSB0aGF0IGEgc2ltaWxhciBwYXR0ZXJuIGlzIGV4cGVjdGVkIGZvciB0aGUgb3RoZXIgOTcgc2l0ZXMgZHVlIHRvIHRoZSBkYXRhIHVuZGVyIHN0dWR5LiBBIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGRhaWx5IGFuZCBzZWFzb25hbCBwYXR0ZXJuIGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3ljbGUuIFRoZSBkYWlseSBjeWNsZSBjYW4gYmUgbWVhc3VyZWQgaW4gaG91cnMuIEluIGNvbnRyYXN0LCB0aGUgc2Vhc29uYWwgY3ljbGUgdGFrZXMgbW9udGhzLiBJbiBnZW5lcmFsLCB0aGlzIHNlYXNvbmFsIHBhdHRlcm4gc2hvd3MgaXRzIGhpZ2hlc3QgdmFsdWVzIGR1cmluZyBzdW1tZXIgbW9udGhzIGFuZCBpdHMgbG93ZXN0IHZhbHVlcyBkdXJpbmcgd2ludGVyIG1vbnRocy4gCgoKYGBge3IgdHMtc2Vhc29uYWxpdHktMi15ZWFyc30KCnRpbWVfc2VyaWVzX29uZV95ZWFyX21lc29uZXQgPC0gZ2dwbG90KHNvbGFyX2lycmFkaWF0aW9uLCBhZXMoeCA9IHNvbGFyX2lycmFkaWF0aW9uJERhdGUsIHkgPSBzb2xhcl9pcnJhZGlhdGlvbiRBQ01FKSkgICsgZ2VvbV9saW5lKCkgCnRpbWVfc2VyaWVzX29uZV95ZWFyX21lc29uZXQgPC0gdGltZV9zZXJpZXNfb25lX3llYXJfbWVzb25ldCArIGxhYnModGl0bGUgPSAiU2Vhc29uYWxpdHkgLSB0d28geWVhcnMgdmlldyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkFDTUUgbWVzb25ldCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAic291cmNlOiBzb2xhcl9pcnJhZGlhdGlvbiAoZHQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gIkRhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gIklycmFkaWF0aW9uIikgCnRpbWVfc2VyaWVzX29uZV95ZWFyX21lc29uZXQgPC0gdGltZV9zZXJpZXNfb25lX3llYXJfbWVzb25ldCArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAiMTAiLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpKSAgCnRpbWVfc2VyaWVzX29uZV95ZWFyX21lc29uZXQgPC0gdGltZV9zZXJpZXNfb25lX3llYXJfbWVzb25ldCArIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlWS0lbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9icmVha3MgPSAiMyBtb250aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYXMuRGF0ZShjKCIyMDAwLTAxLTAxIiwgIjIwMDEtMTItMzEiKSkpCnRpbWVfc2VyaWVzX29uZV95ZWFyX21lc29uZXQKCmBgYAoKClRoaXMgaXMgYSBmaXJzdCBhc3Nlc3NtZW50IG9mIHRoZSBkYXRhLiBXZSB3aWxsIHByb3ZpZGUgYSBtb3JlIGRldGFpbGVkIHN0dWR5IGluIFtFREEgKHBhcnQgSUkpXSgjZWRhLTIpLiAKCgoKCgoKIyMjIFN0YXRpb24gaW5mb3JtYXRpb24gZGF0YSB7I3N0YXRpb24tZGF0YX0gIAoKRGF0YSBhYm91dCB0aGUgbG9jYXRpb24gb2YgZWFjaCBvZiB0aGUgOTggd2VhdGhlciBzdGF0aW9ucyBpcyBzdG9yZWQgaW4gdGhlIGZpbGUgYHN0YXRpb25faW5mby5jc3ZgLiBBIGhpZ2gtbGV2ZWwgdmlldyBvZiB0aGUgc3RydWN0dXJlIGlzIHByb3ZpZGVkIGluIHRoZSB0YWJsZSBiZWxvdy4gRm9yIGRldGFpbGVkIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIHNlZSBbdGhpcyBzZWN0aW9uXSgjZXhwbG9yYXRpb24pLiAKCnxDb2x1bW4gbnVtYmVyfENvbHVtbiBuYW1lfERhdGEgdHlwZXxJbnRlcnByZXRhdGlvbnwKfC0tLXwtLS18LS0tfC0tLXwKfDF8c3RpZHxDaGFyYWN0ZXJ8V2VhdGhlciAoTWVzb25ldCkgc3RhdGlvbiBuYW1lfAp8MnxubGF0fE51bWVyaWN8TGF0aXR1ZGV8CnwzfGVsb258TnVtZXJpY3xMb25naXR1ZHwKfDR8ZWxldnxJbnRlZ2VyfEVsZXZhdGlvbiBpbiBtZXRlcnwKCioqTk9URSoqOiBXZSBoYXZlIGNyZWF0ZWQgYSBkYXRhLnRhYmxlIG9iamVjdCBgc29sYXJfc3RhdGlvbnNgIGZyb20gYHN0YXRpb25zYCBwcmVzZXJ2aW5nIHRoZSBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsLgoKQW4gZXh0cmFjdCBvZiB0aGUgZGF0YSAoZmlyc3QgNSByb3dzKSBpcyBzaG93biBiZWxvdy4KCmBgYHtyIHNvbGFyLXN0YXRpb25zfQpzb2xhcl9zdGF0aW9ucyA8LSBzdGF0aW9uczsgIyBtYWtpbmcgYSBjb3B5IHRvIHdvcmsgd2l0aApoZWFkKHNvbGFyX3N0YXRpb25zKVsxOjUsXSAjIGRpc3BsYXlpbmcgdGhlIGZpcnN0IGNvbHVtbiBvZiBlYWNoIHR5cGUKYGBgCgojIyMjIEZpbmRpbmcgY2x1c3RlcnMKClRoZSBlbGV2YXRpb24gb2YgbWVzb25ldHMgY291bGQgYmUgdXNlZCB0byBjbHVzdGVyIHRoZW0uIFRoYXQgaXMgd2h5LCB3ZSBsb29rZWQgY2xvc2VyIHRvIHRoZSBlbGV2YXRpb24gdmFyaWFibGUgdG8gc2VlIGlmIGNsdXN0ZXJzIGNvdWxkIGJlIGRlcml2ZWQuIEZyb20gdGhlcmUgd2Ugb2JzZXJ2ZWQgdGhhdCB0aGVyZSBhcmUgOCBjbHVzdGVycyBpbiB3aGljaCBtZXNvbmV0cyBjb3VsZCBiZSBncm91cGVkIGluIHRlcm1zIG9mIHRoZSBlbGV2YXRpb24uIFRoZSBncm91cHMvY2x1c3RlcnMgYXJlIHNob3duIGJlbG93OgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KI3N1bW1hcnkoc29sYXJfc3RhdGlvbnMkZWxldikgIyBnZXQgdGhlIHN1bW1hcnkKYmluX3N0YXRpb25zX2VsZXZhdGlvbiA8LSBiaW5uaW5nKHNvbGFyX3N0YXRpb25zJGVsZXYsIHR5cGUgPSAia21lYW5zIikgIyBjcmVhdGUgYmluIG9iamVjdAojY2xhc3MoYmluX3N0YXRpb25zX2VsZXZhdGlvbikgIyBvYmplY3Qgb2YgY2xhc3MgYmluCiNsYWJlbHMoYmluX3N0YXRpb25zX2VsZXZhdGlvbikgIyBsYWJlbHMgdGhhdCByZXByZXNlbnQgZWFjaCBtZXNvbmV0CiNsZXZlbHMoYmluX3N0YXRpb25zX2VsZXZhdGlvbikKCmBgYAoKYGBge3J9CiNsZXZlbHMoYmluX3N0YXRpb25zX2VsZXZhdGlvbikgIyBjbHVzdGVycwpwbG90KGJpbl9zdGF0aW9uc19lbGV2YXRpb24pICMgcGxvdHMgdGhlIGRlbnNpdHkgYW5kIHRoZSBmcmVxdWVuY3kKYGBgCgoKV2UgcmVzZXJ2ZSB0aGlzIGluZm9ybWF0aW9uIGZvciBhIHBvdGVudGlhbCB1c2UgbGF0ZXIgaW4gdGhlIHN0dWR5LgoKCgoKCgojIyMjIE1hcHBpbmcgd2VhdGhlciBzdGF0aW9ucyB7I21hcHBpbmctc3RhdGlvbnN9CgpUaGUgbWFwIGJlbG93IGRpc3BsYXlzIHRoZSA5OCB3ZWF0aGVyIHN0YXRpb25zIChNZXNvbmV0cykgaW4gT2tsYWhvbWEuCgpgYGB7ciBtYXBwaW5nLXN0YXRpb25zfQojc3RlcHMKY29sbmFtZXMoc29sYXJfc3RhdGlvbnMpIDwtIGMoInN0aWQiLCAibGF0IiwgImxuZyIsICJlbGV2IikgIyBtb2RpZnkgbmFtZXMgZm9yIGF1dG8gcmVjb2duaXRpb24gYnkgbGVhZmxldCBwYWNrYWdlCgptZXNvbmV0cyA8LSBsZWFmbGV0KCkgJT4lCiAgICAgICAgYWRkVGlsZXMoKSAlPiUgICMgQWRkIGRlZmF1bHQgT3BlblN0cmVldE1hcCBtYXAgdGlsZXMKICAgICAgICBhZGRNYXJrZXJzKGxuZz1zb2xhcl9zdGF0aW9ucyRsbmcsIGxhdD1zb2xhcl9zdGF0aW9ucyRsYXQsIHBvcHVwPXNvbGFyX3N0YXRpb25zJHN0aWQpCm1lc29uZXRzICAjIFByaW50IHRoZSBtYXAKCmBgYAoKCgoKIyMjIE51bWVyaWMgd2VhdGhlciBwcmVkaWN0aW9ucyAoTldQKSAgeyNOV1B9CgpUaGUgZmlsZSBgYWRkaXRpb25hbF92YXJpYWJsZXMuUkRhdGFgIGNvbnRhaW5zIDEwMCB3ZWF0aGVyIHByZWRpY3Rpb25zIGZvciBlYWNoIGRheS4gQWNjb3JkaW5nIHRvIHRoZSBleHBsYW5hdGlvbiBpbiBrYWdnbGUsIHRoZSBudW1lcmljYWwgd2VhdGhlciBwcmVkaWN0aW9uIGRhdGEgKE5XUCkgImNvbWVzIGZyb20gdGhlIE5PQUEvRVNSTCBHbG9iYWwgRW5zZW1ibGUgRm9yZWNhc3QgU3lzdGVtIChHRUZTKSBSZWZvcmVjYXN0IFZlcnNpb24gMi4iIFRoaXMgZGF0YSwgaXQgY29udGludWVzLCAiaW5jbHVkZSBhbGwgMTEgZW5zZW1ibGUgbWVtYmVycyBhbmQgdGhlIGZvcmVjYXN0IHRpbWVzdGVwcyAxMiwgMTUsIDE4LCAyMSwgYW5kIDI0LiIgQSBoaWdoLWxldmVsIHZpZXcgb2YgdGhlIHN0cnVjdHVyZSBpcyBwcm92aWRlZCBpbiB0aGUgdGFibGUgYmVsb3cuIEZvciBkZXRhaWxlZCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBzZWUgW3RoaXMgc2VjdGlvbl0oI2V4cGxvcmF0aW9uKS4KCnxDb2x1bW4gbnVtYmVyfENvbHVtbiBuYW1lfERhdGEgdHlwZXxJbnRlcnByZXRhdGlvbnwKfC0tLXwtLS18LS0tfC0tLXwKfDF8RGF0ZXxDaGFyYWN0ZXJ8RGF0ZSBvZiBpbnRlcmVzdHwKfDItMTAxfFYuLi58TnVtZXJpY3xOV1B8CgoqKk5PVEUqKjogV2UgaGF2ZSBjcmVhdGVkIGEgZGF0YS50YWJsZSBvYmplY3QgYHNvbGFyX2V4dHJhYCBmcm9tIGBleHRyYV92YXJzYCBjYXN0aW5nIG9ubHkgdGhlIGRhdGUgY29sdW1uIHRvIGRhdGUgZm9ybWF0LgoKQW4gZXh0cmFjdCBvZiB0aGUgZGF0YSAoZmlyc3QgNSByb3dzIGFuZCBjb2x1bW5zKSBpcyBzaG93biBiZWxvdy4KCmBgYHtyIHNvbGFyLWV4dHJhfQpzb2xhcl9leHRyYSA8LSBleHRyYV92YXJzOyAjIG1ha2luZyBhIGNvcHkgdG8gd29yayB3aXRoCgojIyBjYXN0aW5nIHRvIGRhdGUKc29sYXJfZXh0cmEkRGF0ZSA8LSBhcy5EYXRlLmNoYXJhY3Rlcihzb2xhcl9leHRyYSREYXRlLCBmb3JtYXQgPSBjKCIlWSVtJWQiKSk7ICNjYXN0aW5nIHZhcmlhYmxlIHRvIGRhdGUgZm9ybWF0CgpoZWFkKHNvbGFyX2V4dHJhKVsxOjUsMTo1XSAjIGRpc3BsYXlpbmcgZmlyc3QgNSByb3dzIGFuZCBjb2x1bW5zCmBgYAoKCgojIyBFeHBsb3JpbmcgZGF0YXNldHMgeyNleHBsb3JhdGlvbn0KCkluIHRoaXMgc2VjdGlvbiB3ZSBleHBsb3JlIHRoZSBkYXRhc2V0cyBieSBvYnNlcnZpbmcgZXhpc3RpbmcgZGF0YSB0eXBlcywgZGF0YSBjb21wbGV0ZW5lc3MgYW5kIHBlcmZvcm1pbmcgdW5pdmFyaWF0ZSBhbmQgbXVsdGl2YXJpYXRlIGFuYWx5c2lzLiAKCiMjIyBEYXRhIHR5cGVzIHsjZGF0YS10eXBlc30KCkFzIGV4cGxhaW5lZCBicmllZmx5IGluIHRoZSAqKk5vdGVzKiogYWJvdmUsIHdlIGhhdmUgYWxyZWFkeSBleHBsb3JlIHRoZSBkYXRhLiBGcm9tIG91ciBmaXJzdCBleHBsb3JhdGlvbiB3ZSBvYnNlcnZlZCB0aGUgZm9sbG93aW5nOiAgCi0gU29tZSBkYXRhIHR5cGVzIHdlcmUgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdDogVGhpcyBpcyB0aGUgY2FzZSBmb3IgZGF0ZSBhbmQgc29sYXIgaXJyYWRpYXRpb24gdmFyaWFibGVzLAotIEFsbCBzb2xhciBpcnJhZGlhdGlvbiB0aW1lIHNlcmllcyBoYXZlIG1pc3NpbmcgZGF0YSAoTkEpOiAibWlzc2luZyIgdmFsdWVzIGZvciBlYWNoIHZhcmlhYmxlIGFtb3VudHMgdG8gMjYlLgoKVGhlIGZpcnN0IG9ic2VydmF0aW9uIHdhcyB0YWNrbGVkIGJ5IHJlZm9ybWF0dGluZyB0aGVzZSB2YXJpYWJsZXMgdG8gdGhlIGNvcnJlY3QgZGF0YSB0eXBlcy4gQXMgc2hvd24gaW4gdGhlIHRhYmxlIGJlbG93LgoKfFNvdXJjZXxWYXJpYWJsZSBuYW1lfFZhcmlhYmxlIHR5cGUgKG9yaWdpbmFsKXxWYXJpYWJsZSB0eXBlIChjb3JyZWN0ZWQpfAp8LS0tfC0tLXwtLS18LS0tfAp8YHNvbGFyX2RhdGFzZXQuUkRhdGFgfERhdGV8Q2hhcmFjdGVyfERhdGV8Cnxgc29sYXJfZGF0YXNldC5SRGF0YWB8U29sYXIgaXJyYWRpYXRpb24gKGNvbHMgMi05OSl8SW50ZWdlcnxOdW1lcmljfAp8YGFkZGl0aW9uYWxfdmFyaWFibGVzLlJEYXRhYHxEYXRlfENoYXJhY3RlcnxEYXRlfAoKTm90ZSB0aGF0IHdlIGhhdmUgcHJlc2VydmVkIHRoZSBvcmlnaW5hbCBkYXRhICh3ZSBiZWxpZXZlIHRoaXMgaXMgYSBnb29kIHByYWN0aWNlKS4gVGhlcmVmb3JlLCB0byBtYWtlIGFsbCBtb2RpZmljYXRpb25zIGV4cGxhaW5lZCBhYm92ZSB3ZSBjcmVhdGVkIHRocmVlIG5ldyBvYmplY3RzIChvZiB0eXBlIGRhdGEudGFibGUgYXMgaGludGVkIGluIHRoZSBub3RlcykuIAoKVGhlIHN0cnVjdHVyZSBvZiB0aGVzZSB0aHJlZSBvYmplY3RzIGlzIGhpZ2hsaWdodGVkIGJlbG93LiBGb3IgY29uc2lzdGVuY3kgYW5kIHJlYWRhYmlsaXR5IHB1cnBvc2VzLCB3ZSBhcmUgb25seSBzaG93aW5nIGFuIGV4dHJhY3Qgb2YgdGhlIGRhdGEuIFJlbGV2YW50IHN0YXRpc3RpY3MgYXJlIHNob3duIGluIFt0aGlzIHNlY3Rpb25dKCNleHBsb3JhdGlvbikuCgoqKnNvbGFyX2lycmFkaWF0aW9uIChkYXRhLnRhYmxlKSoqCmBgYHtyfQoKc3RyKHNvbGFyX2lycmFkaWF0aW9uWzE6NSwxOjVdKQoKYGBgCgoqKnNvbGFyX3N0YXRpb25zIChkYXRhLnRhYmxlKSoqCmBgYHtyfQoKc3RyKHNvbGFyX3N0YXRpb25zKQoKYGBgCgoqKnNvbGFyX2V4dHJhIChkYXRhLnRhYmxlKSoqCmBgYHtyfQoKc3RyKHNvbGFyX2V4dHJhWzE6NSwxOjVdKQoKYGBgCgpUaGVzZSBvYmplY3RzIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGFuYWx5c2lzLgoKVGhlIHNlY29uZCBvYnNlcnZhdGlvbiBuZWVkcyBubyBhY3Rpb24uIFRoZSBwYXJ0IG9mIHRoZSBzZXJpZXMgdGhhdCBoYXZlIE5BIG5lZWRzIHRvIGJlIHByZWRpY3RlZC4gVGhlcmVmb3JlLCB2YWx1ZXMgZm9yIHRoaXMgcGFydCBvZiB0aGUgc2VyaWVzIHdpbGwgYmUgZXN0aW1hdGVkIGluIHRoZSB0cmFpbmluZyBhbmQgcHJlZGljdGlvbiBzZWN0aW9ucy4KCgoKCgojIyMgRGF0YSBjb21wbGV0ZW5lc3MgeyNkYXRhLWNvbXBsZXRlbmVzc30KCkxvb2tpbmcgYXQgdGhlIFtvcmlnaW5hbCBkYXRhc2V0c10oI2RhdGEpLCB0d28gZGF0YXNldHMgaGF2ZSBtaXNzaW5nIHZhbHVlcy4gVGhlIGBzb2xhcl9kYXRhc2V0LlJEYXRhYCBoYXMgMTc5NiAibWlzc2luZyIgdmFsdWVzIHBlciB2YXJpYWJsZS4gVGhhdCBpcywgMjYlIG9mIHRoZSB0b3RhbCA2OTA5IG9ic2VydmF0aW9ucyBhcmUgbWlzc2luZyBmb3IgZWFjaCB3ZWF0aGVyIHN0YXRpb24uIEluIGNvbnRyYXN0LCB0aGUgcmF0aW8gb2YgbWlzc2luZyB2YWx1ZXMgZm9yIHRoZSBgYWRkaXRpb25hbF92YXJpYWJsZXMuUkRhdGFgIGRhdGFzZXQgY2FuIGJlIHNlcGFyYXRlZCBpbnRvIHR3byBncm91cHMgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50IG9mIGRhdGEgbWlzc2luZyBhcyBpbGx1c3RyYXRlZCBpbiB0aGUgZmlndXJlcyBiZWxvdy4KCmBgYHtyIHBsb3RzLW1pc3Npbmd9CiMjIHVzaW5nIGdncGxvdCwgRGF0YUV4cGxvcmVyIGFuZCBncmlkCnAxIDwtIHBsb3RfbWlzc2luZyhzb2xhcl9leHRyYVssMjoyNV0sIAogICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBsaXN0KCJsZXNzXzUlIiA9IDAuMDUsICJiZXR3ZWVuXzVfMTAlIiA9IDAuMSwgImFib3ZlXzEwJSIgPSAxKSwgCiAgICAgICAgICAgICAgICAgICBnZW9tX2xhYmVsX2FyZ3MgPSBsaXN0KCJzaXplIiA9IDIsICJsYWJlbC5wYWRkaW5nIiA9IHVuaXQoMC4xLCAibGluZXMiKSkpIApwMiA8LSBwbG90X21pc3Npbmcoc29sYXJfZXh0cmFbLDI2OjUwXSwgCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGxpc3QoImxlc3NfNSUiID0gMC4wNSwgImJldHdlZW5fNV8xMCUiID0gMC4xLCAiYWJvdmVfMTAlIiA9IDEpLAogICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9hcmdzID0gbGlzdCgic2l6ZSIgPSAyLCAibGFiZWwucGFkZGluZyIgPSB1bml0KDAuMSwgImxpbmVzIikpKQpwMyA8LSBwbG90X21pc3Npbmcoc29sYXJfZXh0cmFbLDUxOjc1XSwgCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGxpc3QoImxlc3NfNSUiID0gMC4wNSwgImJldHdlZW5fNV8xMCUiID0gMC4xLCAiYWJvdmVfMTAlIiA9IDEpLAogICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9hcmdzID0gbGlzdCgic2l6ZSIgPSAyLCAibGFiZWwucGFkZGluZyIgPSB1bml0KDAuMSwgImxpbmVzIikpKQpwNCA8LSBwbG90X21pc3Npbmcoc29sYXJfZXh0cmFbLDc2OjEwMV0sIAogICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBsaXN0KCJsZXNzXzUlIiA9IDAuMDUsICJiZXR3ZWVuXzVfMTAlIiA9IDAuMSwgImFib3ZlXzEwJSIgPSAxKSwKICAgICAgICAgICAgICAgICAgIGdlb21fbGFiZWxfYXJncyA9IGxpc3QoInNpemUiID0gMiwgImxhYmVsLnBhZGRpbmciID0gdW5pdCgwLjEsICJsaW5lcyIpKSkKI2dyaWQuYXJyYW5nZShwMSxwMixwMyxwNCwgbnJvdyA9IDIpCmBgYAoKTm93LCB3ZSBpbXBsZW1lbnQgYSBtaXNzaW5nIHBsb3QgdG8gZ2V0IGRpZmZlcmVudCB2aWV3IG9mIHRoZSBhbW91bnQgb2YgbWlzc2luZyBkYXRhIGFjcm9zcyBvdXIgZGF0YXNldC4gRnJvbSB0aGUgbGVmdCB0byB0aGUgcmlnaHQgb2YgdGhlIGZpZ3VyZSBiZWxvdywgd2Ugb2JzZXJ2ZSB0aGUgcmF0aW8gb2YgbWlzc2luZyBkYXRhIChkaXNwbGF5ZWQgaW4gdGhlIHkgYXhpcyBpbiByZWQpIGZvciBvdXIgYXR0cmlidXRlcyAoZGlzcGxheWVkIGluIHRoZSB4IGF4aXMpLiBOb3RlIHRoYXQgdGhlIGF0dHJpYnV0ZXMgd2l0aCB0aGUgaGlnaGVzdCByYXRpbyBvZiBtaXNzaW5nIGRhdGEgYXJlIG9ic2VydmVkIG9uIHRoZSBsZWZ0IG9mIHRoZSBmaWd1cmUuCgoKYGBge3IgbWlzc2luZy1tYXAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm1pc3NtYXAoc29sYXJfZXh0cmFbLC0xXSwgCiAgICAgICAgY29sID0gYygicmVkIiwgImdyZXkiKSwgCiAgICAgICAgeC5jZXggPSAwLjUsCiAgICAgICAgeS5jZXggPSAwLjUsCiAgICAgICAgbGVnZW5kID0gRkFMU0UpCmBgYAoKV2UgcmVzZXJ2ZSB0aGlzIGluZm9ybWF0aW9uIGZvciBhIHBvdGVudGlhbCB1c2UgbGF0ZXIgaW4gdGhlIHN0dWR5LgoKCiMjIyBVbml2YXJpYXRlIGFuYWx5c2lzIHsjdW5pdmFyaWF0ZX0KCkluIHRoaXMgc2VjdGlvbiB3ZSBhaW0gYXQgbGVhcm5pbmcgYWJvdXQgdGhlIGNlbnRyYWwgdGVuZGVuY3ksIGRpc3RyaWJ1dGlvbiBhbmQgc3ByZWFkIG9mIGRhdGEuIFJlbGV2YW50IHN0YXRpc3RpY3MgdG8gb2JzZXJ2ZSB0aGUgY2VudHJhbCB0ZW5kZW5jeSBhcmUgZGVzY3JpYmVkIGJlbG93LgoKVGhlIHRhYmxlIGJlbG93IHNob3dzIHJlbGV2YW50IHN0YXRpc3RpY3MgZm9yIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHNvbGFyIGlycmFkaWF0aW9uIG1lYXN1cmVtZW50cyBmcm9tIGFsbCB3ZWF0aGVyIHN0YXRpb25zLiAKCmBgYHtyIGRlc2NyaWJlLXNvbGFyLWlycmFkaWF0aW9ufQpkZXNjcmliZShzb2xhcl9pcnJhZGlhdGlvbikgIyBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHVzaW5nIGRsb29rcgpgYGAKCgojIyMgVW5pdmFyaWF0ZSB2aXN1YWxpemF0aW9uIHsjdW5pdmFyaWF0ZS12aXp9CgpUbyBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEsIHdlIHVzZWQgYSBib3hwbG90LiBUaGlzIHZpc3VhbGl6YXRpb24gYWxsb3dzIHVzIHRvIGRpc3BsYXkgcmVsZXZhbnQgc3RhdGlzdGljcyBvZiBhbGwgOTggdmFyaWFibGVzIGluIG9uZSBwbG90LiBBcyBhIHJlbWluZGVyLCB0aGUgYm94IGNhcHR1cmVzIHRoZSBtaWRkbGUgNTAlIG9mIHRoZSBkYXRhIChmcm9tIFExIHRvIFEzKS4gVGhlIG1lZGlhbiBpcyByZXByZXNlbnRlZCBieSB0aGUgaG9yaXpvbnRhbCBsaW5lIGluIHRoZSBib3guIFRoZSB3aGlza2VycyAobGluZXMgd2l0aCBhIFQtc2hhcGUpIHByb3ZpZGVzIGFuIGlkZWEgb2YgdGhlIGRpc3BlcnNpb24gb2YgdGhlIGRhdGEuIERhdGEgcG9pbnRzIG9ic2VydmVkIG91dHNpZGUgdGhlc2UgbGluZXMsIGlmIGFueSwgbWF5IHJlcXVpcmUgZnVydGhlciBleHBsb3JhdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlc2UgcG9pbnRzIG1heSBiZSBjb25zaWRlciBhcyBvdXRsaWVycy4KCkZyb20gdGhlIGZpZ3VyZSBiZWxvdywgd2Ugb2JzZXJ2ZSB0aGF0IG1vc3QgdmFyaWFibGVzIGFyZSB3aXRoaW4gdGhlIHNhbWUgcmFuZ2UuIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgdmFsdWUgZm91bmQgaW4gdGhlIGRhdGFzZXQgYXJlIGhpZ2hsaWdodGVkIGJ5IHRoZSBibHVlIGFuZCBncmVlbiBsaW5lcywgcmVzcGVjdGl2ZWx5LiBUaGUgcmVkIGxpbmUgaWxsdXN0cmF0ZXMgdGhlIG1lYW4gb2YgdGhlIDk4IHdlYXRoZXIgc3RhdGlvbnMuIFRoZSB1cHBlciB3aGlza2VyIG9ic2VydmVkIGZvciB0aGUgSURBQiB3ZWF0aGVyIHN0YXRpb24gaXMgZHJpdmVuIGJ5IHRoZSBoaWdoZXN0IHZhbHVlIGZvdW5kIGluIHRoZSBkYXRhc2V0LiBUaGlzIHZhbHVlIGJlaW5nIGByIG1heChzb2xhcl9pcnJhZGlhdGlvbiRJREFCKWAuIAoKYGBge3IgYm94cGxvdC1hbGx9CiMgYSBmaXJzdCBib3hwbG90IHRvIGdldCBhIHNlbnNlIG9mIHRoZSBkaXN0cmlidXRpb25zIG9mIHNvbGFyIGlycmFkaWF0aW9uCmJveHBsb3Qoc29sYXJfaXJyYWRpYXRpb25bLC0xXSkgIyBib3hwbG90IG9mIGFsbCA5OCBzdGF0aW9ucwphYmxpbmUoaCA9IHNhbXBsZV9tZWFuLCBjb2wgPSAicmVkIikKYWJsaW5lKGggPSBzYW1wbGVfbWluLCBjb2wgPSAiZ3JlZW4iKQphYmxpbmUoaCA9IHNhbXBsZV9tYXgsIGNvbCA9ICJibHVlIikKYGBgCgojIyMgRmluZGluZyBvdXRsaWVycwoKQmFzZWQgb24gdGhlIGJveHBsb3QgYWJvdmUsIHdlIG9ic2VydmUgdGhhdCB0aGUgd2VhdGhlciBzdGF0aW9uIElEQUIgaGFzIGEgaGlnaGVyIGxlbmd0aCBvZiB3aXNrZXJzLiBUaGVyZWZvcmUsIHdlIGJlbGlldmUgaXQgaXMgd29ydGh3aGlsZSB0byBmb2N1cyBvbiB0aGlzIGRpc3RyaWJ1dGlvbiB0byBzZWUgaWYgd2l0aGluIG91ciBkYXRhc2V0IGBzb2xhcl9pcnJhZGlhdGlvbmAgb3V0bGllcnMgZXhpc3QuIEFzIGEgZmlyc3Qgc3RlcCwgbGV0cyB2aXN1YWxseSBhbmFseXNlIHRoaXMgc2VyaWVzIGJ5IG1lYW5zIG9mIGEgYm94cGxvdCAoc2VlIGJlbG93KS4gCgpgYGB7ciBib3hwbG90LUlEQUJ9CmJveHBsb3Qoc29sYXJfaXJyYWRpYXRpb24kSURBQikgIyBib3hwbG90IG9mIElEQUIKYGBgCgpBZnRlciBhIGNsb3NlIGV4YW1pbmF0aW9uLCB3ZSBkbyBub3Qgb2JzZXJ2ZSBhc3BlY3RzIG91dCBvZiB0aGUgb3JkaW5hcnkuIEJ1dCwgbGV0cyBzYXkgdGhhdCB3ZSBhcmUgc3RpbGwgc2tlcHRpY2FsLiBUaGVyZWZvcmUsIGFzIGEgc2Vjb25kIHN0ZXAsIGxldHMgbG9vayBpbnRvIHRoZSB3aG9sZSBkYXRhc2V0IHdpdGggYSBkaWZmZXJlbnQgbWV0aG9kLiBXaXRoIHRoZSBoZWxwIG9mIHRoZSBmdW5jdGlvbiBgZGlhZ25vc2Vfb3V0bGllcmAgaW4gdGhlIGBkbG9va3JgIGxpYnJhcnkgd2Ugb2J0YWluIGEgZGlhZ25vc2lzIG9mIG91ciBudW1lcmljYWwgZGF0YS4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbGlicmFyeSBwbGVhc2UgcmVmZXIgdG8gdGhlIFthbm5leCBJXSgjYW5uZXgtMSkuIAoKYGBge3IgZGlhZ25vc2Utb3V0bGllcnN9CmRpYWdfb3V0bGllcnMgPC0gZGlhZ25vc2Vfb3V0bGllcihzb2xhcl9pcnJhZGlhdGlvbikKZGlhZ19vdXRsaWVycwpgYGAKQmFzaWNhbGx5LCBmcm9tIHRoZSB0YWJsZSB3ZSBvYnNlcnZlIHRoYXQgdGhlcmUgYXJlIGByIHN1bShkaWFnX291dGxpZXJzJG91dGxpZXJzX2NudClgIG91dGxpZXJzLiBXZSBiZWxlaXZlIHRoaXMgcHJvdmlkZXMgc3VmZmljaWVudCBwcm92ZSB0aGF0IG91ciBkYXRhc2V0IHNob3dzIG5vIHNpZ25zIG9mIG91dGxpZXJzLiAgICAKCiMjIyBOb3JtYWxpdHkgdGVzdAoKSW4gdGhlIGZvbGxvd2luZywgd2UgYXBwbHkgYSBub3JtYWxpdHkgdGVzdC4gRnJvbSBvdXIgZXhwbG9yYXRpb24gd2UgZm91bmQgdGhhdCBhbGwgb3VyIHZhcmlhYmxlcyBzaG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gVG8gZXhlbXBsaWZ5IHRoaXMsIHdlIHByZXNlbnQgYmVsb3cgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgYXQgdGhlIHR3byBib3VuZGFyaWVzIG9mIHRoZSBzcGVjdHJ1bS4gVGhhdCBpcywgU0FMTCBhbmQgS0VOVC4KCmBgYHtyIG5vcm1hbGl0eS10ZXN0LCBpbmNsdWRlPUZBTFNFfQpub3JtYWxpdHlfc29sYXJfaXJyYWRpYXRpb24gPC0gIG5vcm1hbGl0eShzb2xhcl9pcnJhZGlhdGlvbikKCm5vcm1hbGl0eV9zb2xhcl9pcnJhZGlhdGlvbiAlPiUgCiAgZmlsdGVyKHBfdmFsdWUgPj0gMC4wNSkgJT4lIAogICAgYXJyYW5nZShkZXNjKHBfdmFsdWUpKQpgYGAKCmBgYHtyIG5vcm1hbGl0eS10ZXN0LWxvd2VzdC1wdmFsdWUsIGluY2x1ZGU9RkFMU0V9Cm5vcm1hbGl0eV9zb2xhcl9pcnJhZGlhdGlvbiAlPiUgCiAgZmlsdGVyKHBfdmFsdWUgPD0gMC4wNSkgJT4lIAogICAgYXJyYW5nZShhYnMocF92YWx1ZSkpCmBgYAoKYGBge3Igbm9ybWFsaXR5LXRlc3QtaGlnaGVzdC1wdmFsdWUsIGluY2x1ZGU9RkFMU0V9Cm5vcm1hbGl0eV9zb2xhcl9pcnJhZGlhdGlvbiAlPiUgCiAgZmlsdGVyKHBfdmFsdWUgPD0gMC4wNSkgJT4lIAogICAgYXJyYW5nZShkZXNjKHBfdmFsdWUpKQpgYGAKCmBgYHtyfQpwbG90X25vcm1hbGl0eShzb2xhcl9pcnJhZGlhdGlvbiwgYygiU0FMTCIsICJLRU5UIikpCmBgYAoKCgojIyMgTXVsdGl2YXJpYXRlIGFuYWx5c2lzIHsjbXVsdGl2YXJpYXRlfQoKQmVsb3cgd2UgZGlzcGxheSB0aGUgY29ycmVsYXRpb24gbWF0cml4LgoKYGBge3IgY29yci1tYXRyaXh9CmNvcnJlbGF0aW9ucyA8LSBjb3Ioc29sYXJfaXJyYWRpYXRpb25bLC0xXSk7CmtibChyb3VuZChjb3JyZWxhdGlvbnMsIDMpKSAlPiUgCiAgI3Njcm9sbF9ib3god2lkdGggPSAiNjUwcHgiLCBoZWlnaHQgPSAiNTAwcHgiKSAlPiUgCiAgc2Nyb2xsX2JveCh3aWR0aCA9ICIzMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgJT4lIAogIGthYmxlX2NsYXNzaWNfMigiaG92ZXIiLCBmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gInNhbnMiKQpgYGAKCkZyb20gdGhlIG1hdHJpeCBhYm92ZSB3ZSBvYnNlcnZlIHRoYXQgcGFpcnMgb2YgdmFyaWFibGVzIHNob3cgYSBoaWdoIGNvcnJlbGF0aW9uLiBMb29raW5nIGF0IGVhY2ggcGFpciB3aXRoIHRoZSBoZWxwIG9mIHRoZSBgZGxvb2tyYCBwYWNrYWdlLCB3ZSBvYnNlcnZlIHRoYXQgYSBsYXJnZSBzZXQgb2YgcGFpcnMgaGF2ZSBhIGNvcnJlbGF0aW9uIGFib3ZlIGFicygwLjc1KS4gVGhpcyBpcyBjb25maXJtZWQgYnkgdGhlIGNvcnJlbGF0aW9uIHBsb3QgcHJlc2VudGVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCgpgYGB7cn0KY29ycmVsYXRpb24xIDwtIGNvbXBhcmVfbnVtZXJpYyhzb2xhcl9pcnJhZGlhdGlvbikKY29ycmVsYXRpb24xICU+JSAiJCIoY29ycmVsYXRpb24pICU+JSBmaWx0ZXIoYWJzKGNvZWZfY29ycikgPiAwLjc1KQpgYGAKCiMjIyBNdWx0aXZhcmlhdGUgdmlzdWFsaXphdGlvbiB7I211bHRpdmFyaWF0ZS12aXp9CgoKYGBge3IgY29yci1wbG90fQpjb2xfY29sb3IgPSBicmV3ZXIucGFsKG49OCwgbmFtZT0iUmRZbEJ1IikgIyBkZWZpbmluZyB0aGUgY29sb3Igc2NoZW1lCmNvcnJwbG90KHNvbGFyX2NvcnIsIG1ldGhvZCA9ICJjb2xvciIsIAogICAgICAgICB0eXBlID0gInVwcGVyIiwgCiAgICAgICAgIHRsLmNvbCA9ICJibGFjayIsIAogICAgICAgICBjb2wgPSBjb2xfY29sb3IsIAogICAgICAgICB0bC5jZXggPSAwLjMpICMgb2JzZXJ2YXRpb25zOiBhbGwgYXJlIHBvc2l0aXZlOyBtb3N0IHN0cm9uZyAoPj0gMC43NSkKYGBgCgoKIyMgRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIHsjZGltLXJlZHVjdGlvbn0KCiMjIyBQcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIHsjUENBfQoKQXMgZGVzY3JpYmVkIGluIFt0aGlzIGJsb2ddKGh0dHBzOi8vdG93YXJkc2RhdGFzY2llbmNlLmNvbS90aWR5aW5nLXVwLXdpdGgtcGNhLWFuLWludHJvZHVjdGlvbi10by1wcmluY2lwYWwtY29tcG9uZW50cy1hbmFseXNpcy1mODc2NTk5YWYzODMpLCB0aGUgZ29hbCBvZiBQQ0EgaXMgdG8gaWRlbnRpZnkgcGF0dGVybnMgaW4gYSBkYXRhIHNldCwgYW5kIHRoZW4gZGlzdGlsbCB0aGUgdmFyaWFibGVzIGRvd24gdG8gdGhlaXIgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMgc28gdGhhdCB0aGUgZGF0YSBpcyBzaW1wbGlmaWVkIHdpdGhvdXQgbG9zaW5nIGltcG9ydGFudCB0cmFpdHMuIFBDQSBhc2tzIGlmIGFsbCB0aGUgZGltZW5zaW9ucyBvZiBhIGRhdGEgc2V0IHNwYXJrIGpveSBhbmQgdGhlbiBnaXZlcyB0aGUgdXNlciB0aGUgb3B0aW9uIHRvIGVsaW1pbmF0ZSBvbmVzIHRoYXQgZG8gbm90LgoKVGhlIG1haW4gcHVycG9zZSBvZiB1c2luZyB0aGlzIG1ldGhvZCBpbiBvdXIgRURBIGlzIHRvIGltcGxlbWVudCBhIG1vcmUgcm9idXN0IGltcGxlbWVudGF0aW9uIG9mIHNpbmd1bGFyIHZhbHVlIGRlY29tcG9zaXRpb24oU1ZEKS4gVGhpcyBhaWRzIHVzIHdpdGggZGF0YSByZWR1Y3Rpb24gb3IgbWluaW1pemluZyB0aGUgbm9pc2Ugd2l0aGluIG91ciBkYXRhc2V0LiBUaGlzIGlzIGRvbmUgYnkgY29tcGlsaW5nIGFsbCBvYnNlcnZhdGlvbnMgYW5kIHZhcmlhYmxlcyB0byBmaW5kIHdpdGhpbiBhIGNvb3JkaW5hdGUgYXhpcyB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgdG8gcHJvamVjdCB0aGUgYmVzdCBmaXQuIAoKRmlyc3QsIHdlIGNvbXB1dGUgdGhlIFBDcyBhbmQgdmlzdWFsaXplIGVpZ2VudmFsdWVzIChzY3JlZSBwbG90IHNob3duIGJlbG93KS4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyB0aGUgcGVyY2VudGFnZSBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggcHJpbmNpcGFsIGNvbXBvbmVudCBhbmQgaGVscHMgdXMgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0byB1c2UuIAoKCmBgYHtyIHBjYS1zY3JlZXBsb3R9CgpteXByIDwtIHByY29tcChzb2xhcl9pcnJhZGlhdGlvblssLTFdLCBzY2FsZT1UUlVFKQojYWJsaW5lKGggPSAwLjA1LCBjb2w9InJlZCIsIGx0eT0yKQoKZnZpel9laWcobXlwcikgCiNhYmxpbmUoaCA9IDAuMDUsIGNvbD0icmVkIikKCmBgYAoKVGhlIHN1bW1hcnkgaXMgcHJlc2VudGVkIGJlbG93LgoKYGBge3IgcGNhLWFsdGVybmF0aXZlfQpwY2FfMiA8LSBQQ0Eoc29sYXJfaXJyYWRpYXRpb25bLC0xXSwgZ3JhcGggPSBGQUxTRSkgIyB1c2luZyBGYWN0b01pbmVSCmhlYWQocGNhXzIkZWlnKQpgYGAKCkFzIHdlIHNhdyBpbiB0aGUgc2NyZWUgcGxvdCwgdGhlIHBlcmNlbnRhZ2Ugb2YgdmFyaWFuY2VzIGV4cGxhaW5lZCBieSB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBudW1iZXIgMSwgaXMgdmVyeSBoaWdoIGZvciBQQzEgKDg0JSBhcHByb3guKS4gCgpHaXZlbiB0aGF0IHdlIGNhbiBleHBsYWluIDkzLDclIG9mIGFsbCB0aGUgcG9pbnRzIHdpdGggNCBkaWZmZXJlbnQgUEMsIHdlIHdpbGwgZm9jdXMgb24gdGhlIGZpcnN0IDQgUEMuIFRoZXNlIDQgcHJpbmNpcGFsIGNvbXBvbmVudHMgZmFjdG9ycyBoYXZlIHRvIGJlIHJldGFpbmVkIGluIHRoZSBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMuIAoKU29tZSBncmFwaGljIHJlcHJlc2VudGF0aW9uIHRvIHZpc3VhbGl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhlc2UgdmFyaWFibGVzIGFuZCBvYnNlcnZhdGlvbnMgYXJlIHByZXNlbnRlZCBiZWxvdy4gSW4gdGhpcyBjYXNlLCB3ZSBhcmUgcHV0dGluZyB0aGUgUEMyIGluIHRoZSBZIGF4aXMgYW5kIHRoZSBQQzEgaW4gdGhlIFggYXhpcy4gIFdpdGggdGhpcyB3ZSBzZWUgdGhlIGRpZmZlcmVudCBzaWducyAoKy8tKSBpbiB0ZXJtcyBvZiByb3RhdGlvbiBwZXIgcHJpbmNpcGFsIGNvbXBvbmVudC4KCmBgYHtyIHBjYS1jb250cmlifQoKZnZpel9wY2FfaW5kKG15cHIsIGNvbC5pbmQgPSAiY29zMiIsIGdyYWRpZW50LmNvbHMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0ZDNEUwNyIpLCByZXBlbCA9IFRSVUUpCmZ2aXpfcGNhX3ZhcihteXByLCBjb2wudmFyID0gImNvbnRyaWIiLCBncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSxyZXBlbCA9IFRSVUUpCgpgYGAKCkZyb20gdGhlIGNpcmNsZSBvZiBjb3JyZWxhdGlvbnMgKHNlY29uZCBncmFwaCkgd2Ugb2JzZXJ2ZSB0aGF0IGFsbCB2YXJpYWJsZXMgc2VlbSB0byBiZSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBQQzEsIGhvd2V2ZXIgZm9yIFBDMiwgdGhlcmUgaXMgYSA1MC81MCBkaXN0cmlidXRpb24gYmV0d2VlbiB0aGUgdmFyaWFibGVzLiAKCgoKCgoKIyBFREEgKHBhcnQgSUkpIHsjZWRhLTJ9CgpBcyBicmllZmx5IGNvbW1lbnRlZCBpbiB0aGUgZmlyc3QgcGFydCBvZiB0aGlzIFtFREFdKCNlZGEtMSkgb3VyIGRhdGEgKGBzb2xhcl9pcnJhZGlhdGlvbmApIGlzIGZvcm0gb2YgYSBzZXQgb2YgdGltZSBzZXJpZXMuIEluIHRoZSBmb2xsb3dpbmcsIHdlIHdpbGwgcHJlc2VudCBhbiBFREEgZm9yIHRoaXMgZGF0YS4KCiMjIERhdGEgY2xhc3NlcwoKT3VyIGRhdGEgaXMgb2YgY2xhc3MgYG51bWVyaWNgLiBUbyB1c2UgdGhpcyBkYXRhc2V0IHdlIHdpbGwgY2FzdCAoY29udmVydCkgaXQgdG8gYSB0aW1lIHNlcmllcyBvYmplY3QgYHRzX3NvbGFyX2lycmFkaXRhdGlvbmAuCgpgYGB7ciBjYXN0aW5nLTItdHN9Cgp0c19zb2xhcl9pcnJhZGlhdGlvbiA8LSB0cyhzb2xhcl9pcnJhZGlhdGlvblssLTFdLCBmcmVxdWVuY3kgPSAzNjUuMjUgLCBzdGFydCA9IGMoMTk5NCwxLDEpKSAjIHVzaW5nIHRzZXJpZXMKI3RzKHNvbGFyX2lycmFkaWF0aW9uJEFDTUUsIGZyZXF1ZW5jeSA9IDM2NSwgc3RhcnQgPSBjKDE5OTQsMSwxKSwgZW5kID0gYygyMDA3LDEyLDMxKSkKCmBgYAoKIyMgVGltZSBzZXJpZXMgbWFpbiBwcm9wZXJ0aWVzCgpCZWxvdyB3ZSBjYW4gb2JzZXJ2ZSB0aGUgdGltZSBzZXJpZXMgb2YgYWxsIG1lc29uZXRzLgoKYGBge3IgdHMtYWNtZS1wbG90fQoKI2F1dG9wbG90KHRzX3NvbGFyX2lycmFkaWF0aW9uKQphdXRvcGxvdCh0c19zb2xhcl9pcnJhZGlhdGlvblssMV0pCgpgYGAKCgpMZXRzIGV4YW1pbmUgaG93IHJlbGF0ZWQgYXJlIHRoZSBzdWNjZXNzaXZlIG9ic2VydmF0aW9ucyAoa25vd24gYXMgbGFncykgZm9yIHRoZSBBQ01FIHNlcmllcy4gQmVsb3cgd2UgcHJlc2VudCB0aGUgbGFnIHBsb3RzIGZvciBvbmUgKGxhZzEpIGFuZCAzIChsYWcgMS0zKS4KCmBgYHtyIGxhZzEtcGxvdH0KCmdnbGFncGxvdCh0c19zb2xhcl9pcnJhZGlhdGlvblssMV0sIGxhZ3M9MSwgZG8ubGluZXM9RikKCmBgYAoKYGBge3IgbGFnMy1wbG90fQoKZ2dsYWdwbG90KHRzX3NvbGFyX2lycmFkaWF0aW9uWywxXSwgbGFncz0zLCBkby5saW5lcz1GKQoKYGBgCgpCZWxvdyB3ZSBwcmVzZW50IGFuIEVEQSBzdW1tYXJ5IGZvciB0aGUgQUNNRSBzZXJpZXMuIEluIHRoZSBmdXR1cmUsIHRoaXMgd2lsbCBiZSByZWZlciBhcyB0aGUgYGZpbmdlciBwcmludGAuIE9uIHRoZSB0b3AgcGFydCBvZiB0aGUgZ3JhcGggKHNob3duIGJlbG93KSwgd2UgY2FuIG9ic2VydmUgdGhlIHRpbWUgc2VyaWVzIChBQ01FKS4gQmVsb3cgaXQsIHdlIGNhbiBvYnNlcnZlIHRoZSBhdXRvY29ycmVsYXRpb24gKGxlZnQpIGFuZCB0aGUgcGFydGlhbCBhdXRvY29ycmVsYXRpb24gKHJpZ3RoKS4KCmBgYHtyIGZpbmdlci1wcmludH0KCmdndHNkaXNwbGF5KHRzX3NvbGFyX2lycmFkaWF0aW9uWywxXSkKCmBgYAoKQXMgZGVzY3JpYmUgaW4gW0ZvcmVjYXN0aW5nOiBQcmluY2lwbGVzIGFuZCBQcmFjdGljZV0oaHR0cHM6Ly9vdGV4dHMuY29tL2ZwcDIvKSwgYXV0b2NvcnJlbGF0aW9uICJhdXRvY29ycmVsYXRpb24gbWVhc3VyZXMgdGhlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBsYWdnZWQgdmFsdWVzIG9mIGEgdGltZSBzZXJpZXMuIgpJbiB0aGUgY29ycmVsb2dyYW0gKGdyYXBoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFDRikgd2UgY2FuIG9ic2VydmUgdGhlIGZvbGxvd2luZzogIAotIEFsbCBsYWdzIGhhdmUgY29ycmVsYXRpb25zIHRoYXQgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gemVybyAoc2VlIGJsdWUgZGFzaGVkIGxpbmVzKS4gIAotIFRoZXJlIGFyZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29ycmVsYXRpb25zLiAKLSBDbGVhcmx5IGRlZmluZWQgcGVha3MgYW5kIHZhbGxleXMgKHdoaWNoIGNhbiBhbHNvIGJlIGRlc2NyaWJlZCBhcyBoYXZpbmcgYSDigJxzY2FsbG9wZWTigJ0gc2hhcGUgYWNjb3JkaW5nIHRvIFJvYiBKLiBIeW5kbWFuIGluIFtGb3JlY2FzdGluZzogUHJpbmNpcGxlcyBhbmQgUHJhY3RpY2VdKGh0dHBzOi8vb3RleHRzLmNvbS9mcHAyLykpIGNhdXNlZCB0aGUgc2Vhc29uYWxpdHkuCi0gVGhlcmUgaXMgYSBzbWFsbCBhbmQgc2xvdyBkZWNyZWFzZSBpbiB0aGUgQUNGIGFzIHRoZSBsYWdzIGluY3JlYXNlIChmaWd1cmUgYmVsb3cpLiBUaGlzIGlzIGR1ZSB0byB0aGUgdHJlbmQuCgoKYGBge3IgYWNmLXBsb3QtYWNtZX0KCmdnQWNmKHRzX3NvbGFyX2lycmFkaWF0aW9uWywxXSwgbGFnLm1heCA9IDkwKQoKYGBgCgpGb3IgZXhwbGFuYXRpb24gYWJvdXQgdGhlIFBBQ0YgcGxlYXNlIGNoZWNrIHRoaXMgW2Jvb2tdKGh0dHBzOi8vb3RleHRzLmNvbS9mcHAyLykuCgoKIyBUaW1lIHNlcmllcyBmb3JlY2FzdGluZwoKSW4gdGVybXMgb2YgZGF0YSBzcGxpdHRpbmcsIHdlIGhhdmVuJ3Qgc3BsaXR0ZWQgdGhlIGRhdGEgaW50byB0cmFpbiBhbmQgdGVzdCBzZXRzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IGJ5IHVzaW5nIGFsbCB0aGUgZGF0YSBhdmFpbGFibGUgb3VyIG1vZGVsKHMpIGhhdmUgbGVhcm5lZCB0b28gd2VsbCB0aGUgaW50ZXJhY3Rpb25zIGxlYWRpbmcgdG8gb3ZlcmZpdHRpbmcuIEhvd2V2ZXIsIG91ciBrbm93bGVkZ2Ugb24gdGltZSBzZXJpZXMgaXMgbGltaXRlZCBpbiBob3cgdG8gYmVzdCBhcHByb2FjaCB0aGlzIHByb2JsZW0uCgpDb25jZXJuaW5nIGh5cGVyLXBhcmFtZXRlcnMsIHdlIGhhdmUgbm90IG1vZGlmaWVkIGFueSBoeXBlci1wYXJhbWV0ZXIgZm9yIHRoZSBtb2RlbHMgdGhhdCB3ZSBoYXZlIHVzZWQuIEFnYWluLCB3ZSBkbyBub3QgZnVsbHkgdW5kZXJzdGFuZCBob3cgdG8gbW9kaWZ5IHRoZXNlIGh5cGVyLXBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgb3V0Y29tZS4KCldlIGhhdmUgaW1wbGVtZW50ZWQgc2V2ZXJhbCBtZXRob2RzIHRvIHByZWRpY3QgdGhlIDE3OTYgdmFsdWVzIChyZXF1ZXN0ZWQgaW4gdGhlIGthZ2dsZSBjb21wZXRpdGlvbikuIFRoZXNlIG1ldGhvZHMgYXJlIGludHJvZHVjZWQgYmVsb3cuCi0gRVRTICAKLSBBUklNQSAgCi0gTkFJVkUgIAotIFJXRFJJRlQgIAoKV2UgdXNlZCBzdGwgKFNlYXNvbmFsIGFuZCBUcmVuZCBkZWNvbXBvc2l0aW9uIHVzaW5nIExvZXNzKSBhbmQgc3RsZiAoU2Vhc29uYWwgYW5kIFRyZW5kIGRlY29tcG9zaXRpb24gZm9yZWNhc3RpbmcpIGRlY29tcG9zaXRpb24gdGVjaG5pcXVlcy4KClRoZSBiZXN0IHJlc3VsdCB3ZSBvYnRhaW5lZCAoYmFzZWQgb24gTUFFKSB3YXMgZm9yIE5BSVZFLgoKQmVsb3cgd2UgcHJvdmlkZSB0aGUgY29kZSBvZiBvdXIgYmVzdCBtb2RlbC4gCgpgYGB7ciBmb3JlY2FzdC1jb2RlLCBpbmNsdWRlPVRSVUV9CnRzZGF0YV90ZXN0IDwtIHRzKHNvbGFyX2lycmFkaWF0aW9uWywtMV0sIGZyZXF1ZW5jeSA9IDM2NS4yNSAsc3RhcnQgPSBjKDE5OTQsMSwxKSkKCnByZWRpY3Rpb24gPC0gc29sYXJbNTExNDo2OTA5LDFdCnByZWRpY3Rpb24gPC0gYXMuZGF0YS50YWJsZShwcmVkaWN0aW9uKQpjb2xuYW1lcyhwcmVkaWN0aW9uKSA8LSAiRGF0ZSIKcHJlZGljdGlvbiREYXRlIDwtIGFzLkRhdGUuY2hhcmFjdGVyKHByZWRpY3Rpb24kRGF0ZSwgZm9ybWF0ID0gYygiJVklbSVkIikpOwoKZm9yIChpIGluIDE6OTgpewogIHRzZGF0YTIgPC0gd2luZG93KHRzZGF0YV90ZXN0WyxpXSwgc3RhcnQgPSAxOTk0KQogIGZjYXN0MiA8LSBzdGxmKHRzZGF0YTIsIG1ldGhvZD0nbmFpdmUnLCBoPTE3OTYpCiAgdHNfZHRfZm9yZWNhc3QgPC0gYXMuZGF0YS50YWJsZShzdW1tYXJ5KGZjYXN0MilbLDFdKQogIHByZWRpY3Rpb24gPC0gY2JpbmQocHJlZGljdGlvbiwgdHNfZHRfZm9yZWNhc3QpCn0KCmNvbG5hbWVzKHByZWRpY3Rpb24pIDwtIGNvbG5hbWVzKHNvbGFyX2lycmFkaWF0aW9uKQoKd3JpdGUuY3N2KHByZWRpY3Rpb24sIi9Vc2Vycy9lcml2ZXJvL0RvY3VtZW50cy9NQkRcIElFL3QxL1JcIFBST0dSQU1NSU5HL3NvbGFyX2VuZXJneV9mb3JlY2FzdGluZy9wcmVkaWN0aW9uLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKCgpgYGB7ciBmb3JlY2FzdC1wbG90fQp0c2RhdGEyIDwtIHdpbmRvdyh0c2RhdGFfdGVzdFssMV0sIHN0YXJ0ID0gMTk5NCkKZmNhc3RfYWNtZSA8LSBzdGxmKHRzZGF0YTIsIG1ldGhvZD0nbmFpdmUnLCBoPTE3OTYpCmF1dG9wbG90KGZjYXN0NSkgKyBnZ3RpdGxlKCJGb3JlY2FzdCBBQ01FIikgKwogIHhsYWIoIlllYXIiKSArIHlsYWIoIklycmFkaWF0aW9uIikKYGBgCgoKIyBBbm5leCBJIHsjYW5uZXgtMX0KClRoaXMgc2VjdGlvbiBsaXN0IGxpYnJhcmllcyB3ZSB1c2VkIGluIHRoZSByZWFsaXphdGlvbiBvZiB0aGlzIHByb2plY3QuCgoKIyMgRm9yIGRhdGEgbWFuaXB1bGF0aW9uCgpbZGF0YS50YWJsZV0oaHR0cDovLzEyNy4wLjAuMTozMjIzNy9oZWxwL2xpYnJhcnkvZGF0YS50YWJsZS9kb2MvZGF0YXRhYmxlLWludHJvLmh0bWwpCgoKW2RwbHlyXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcpICAKUHJvdmlkZXMgYSBjb25zaXN0ZW50IHNldCBvZiB2ZXJicyAobXV0YXRlLCBzZWxlY3QsIGZpbHRlciwgLi4uKSB0aGF0IGhlbHAgeW91IHNvbHZlIHRoZSBtb3N0IGNvbW1vbiBkYXRhIG1hbmlwdWxhdGlvbiBjaGFsbGVuZ2VzLgoKCltBbWVsaWFdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9BbWVsaWEvaW5kZXguaHRtbCkgIApBIHByb2dyYW0gZm9yIG1pc3NpbmcgZGF0YQoKIyMgRm9yIHJlcG9ydGluZwoKW2tuaXRyXShodHRwczovL3lpaHVpLm9yZy9rbml0ci8pICAKRWxlZ2FudCwgZmxleGlibGUsIGFuZCBmYXN0IGR5bmFtaWMgcmVwb3J0IGdlbmVyYXRpb24gd2l0aCBSCgoKIyMgRm9yIHRhYmxlcwoKa2FibGUgYW5kIGthYmxlRXh0cmEgKFtsaW5rXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMva2FibGVFeHRyYS92aWduZXR0ZXMvYXdlc29tZV90YWJsZV9pbl9odG1sLmh0bWwjVGFibGVfU3R5bGVzKSkgIApXZSB1c2VkIHRoZXNlIGxpYnJhcmllcyB0byBjcmVhdGUgYXdlc29tZSBIVE1MIHRhYmxlcy4KCiMjIEZvciBkYXRhIGV4cGxvcmF0aW9uCgpbRGF0YUV4cGxvcmVyXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvRGF0YUV4cGxvcmVyL2luZGV4Lmh0bWwpICAKVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIGluIHRoZSBzY2FuLCBhbmFseXNpcyBhbmQgdmlzdWFsaXphdGlvbiBvZiB2YXJpYWJsZXMuCgpbZGxvb2tyXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZGxvb2tyL2luZGV4Lmh0bWwpICAKU3VwcG9ydHMgZGF0YSBkaWFnbm9zaXMsIGV4cGxvcmF0aW9uLCBhbmQgdHJhbnNmb3JtYXRpb24uCgoKIyMgRm9yIG1hcHBpbmcKCltsZWFmbGV0XShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2xlYWZsZXQvKSAgClByb3ZpZGVzIHN1cHBvcnQgaW4gdGhlIGNyZWF0aW9uIG9mIGludGVyYWN0aXZlIG1hcHMuCgoKIyMgRm9yIHN0YXRpc3RpY2FsIHJlcG9ydGluZwoKW3BhcGVSXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcGFwZVIvdmlnbmV0dGVzL3BhcGVSX2ludHJvZHVjdGlvbi5odG1sKSAgCldlIHVzZWQgdGhpcyBsaWJyYXJ5IHRvIGhhbmRsZSB2YXJpYWJsZSBsYWJlbHMgYW5kIHRvIGNyZWF0ZSAoY29tcGxleCkgc3VtbWFyeSB0YWJsZXMuIAoKCiMjIEZvciBwbG90cwoKW2dncGxvdDJdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnKSAgCkZvciBncmFwaGljcyBjcmVhdGlvbgoKCltzY2FsZXNdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9zY2FsZXMvdmVyc2lvbnMvMC40LjEpCkdyYXBoaWNhbCBzY2FsZXMgbWFwIGRhdGEgdG8gYWVzdGhldGljcywgYW5kIHByb3ZpZGUgbWV0aG9kcyBmb3IgYXV0b21hdGljYWxseSBkZXRlcm1pbmluZyBicmVha3MgYW5kIGxhYmVscyBmb3IgYXhlcyBhbmQgbGVnZW5kcy4KCgpndGFibGUsIGdyaWQsIGVnZywgZ3JpZEV4dHJhIChbbGlua10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2VnZy92aWduZXR0ZXMvRWNvc3lzdGVtLmh0bWwpKSAgClVzZWQgdG8gbGF5b3V0IG11bHRpcGxlIHBsb3RzIGluIGEgcGFnZS4gU2VlIGV4cGxhbmF0aW9uIGluIGxpbmsuCgoKW2NvcnJwbG90XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvY29ycnBsb3QvdmlnbmV0dGVzL2NvcnJwbG90LWludHJvLmh0bWwpICAKVG8gZGlzcGxheSBhIGdyYXBoaWNhbCBjb3JyZWxhdGlvbiBtYXRyaXggKGNvcnJlbGF0aW9uIHBsb3QpIGZvciBmYXN0IGRhdGEgdW5kZXJzdGFuZGluZy4KCgpbUkNvbG9yQnJld2VyXShodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvUkNvbG9yQnJld2VyL3ZlcnNpb25zLzEuMS0yL3RvcGljcy9SQ29sb3JCcmV3ZXIpICAKUHJvdmlkZXMgbmljZSBsb29raW5nIGNvbG9yIHBhbGV0dGVzCgoKW0ZhY3RvZXh0cmFdKGh0dHA6Ly93d3cuc3RoZGEuY29tL2VuZ2xpc2gvd2lraS9mYWN0b2V4dHJhLXItcGFja2FnZS1lYXN5LW11bHRpdmFyaWF0ZS1kYXRhLWFuYWx5c2VzLWFuZC1lbGVnYW50LXZpc3VhbGl6YXRpb24pICAKVmlzdWFsaXphdGlvbiBvZiBtdWx0aXZhcmlhdGUgZGF0YSBhbmFseXNpcyByZXN1bHRzCgoKIyMgRm9yIHByZWRpY3Rpb24KCltjYXJldF0oaHR0cHM6Ly90b3BlcG8uZ2l0aHViLmlvL2NhcmV0LykgIApTdHJlYW1zbGluZSB0aGUgcHJvY2VzcyBmb3IgY3JlYXRpbmcgcHJlZGljdGl2ZSBtb2RlbHMKCgpbZm9yZWNhc3RdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9mb3JlY2FzdC9mb3JlY2FzdC5wZGYpICAKRm9yZWNhc3RpbmcgZnVuY3Rpb25zIGZvciB0aW1lIHNlcmllcyBhbmQgbGluZWFyIG1vZGVscwoKCiMjIEZvciB0aW1lIHNlcmllcwoKW3RzZXJpZXNdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy90c2VyaWVzL2luZGV4Lmh0bWwpICAKVGltZSBzZXJpZXMgYW5hbHlzaXMKCiMgQW5uZXggSUkgeyNhbm5leC0yfQoKVGhpcyBzZWN0aW9uIGxpc3QgdXNlZnVsIGxpbmtzIHVzZWQgaW4gdGhlIHJlYWxpemF0aW9uIG9mIHRoaXMgcHJvamVjdC4KCkZvciBFREE6IApbZGF0YSBleHBsb3Jlcl0oaHR0cHM6Ly9ycHVicy5jb20vbWFya19zY2g3L0RhdGFFeHBsb3JlclBhY2thZ2UpCgpGb3IgcGxvdHRpbmc6IApbYWJsaW5lc10oaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2FibGluZS1yLWZ1bmN0aW9uLWFuLWVhc3ktd2F5LXRvLWFkZC1zdHJhaWdodC1saW5lcy10by1hLXBsb3QtdXNpbmctci1zb2Z0d2FyZSksIApbZ2dwbG90XShodHRwczovL2RhdGFjYXJwZW50cnkub3JnL1ItZWNvbG9neS1sZXNzb24vMDQtdmlzdWFsaXphdGlvbi1nZ3Bsb3QyLmh0bWwpLCAKW2dncGxvdDJdKGh0dHBzOi8vbGdhdHRvLmdpdGh1Yi5pby8yMDE3XzExXzA5X1Jjb3Vyc2VfSmVuYS9kYXRhLXZpc3VhbGl6YXRpb24td2l0aC1nZ3Bsb3QyLmh0bWwpLCAKW2dncGxvdDNdKGh0dHBzOi8vd3d3LmRhdGFub3ZpYS5jb20vZW4vYmxvZy9nZ3Bsb3QtYXhpcy1sYWJlbHMvKQoKRm9yIFJNYXJrZG93bjogCltjcm9zcy1yZWZlcmVuY2luZ10oaHR0cHM6Ly91bHluZ3MuZ2l0aHViLmlvL294Zm9yZGRvd24vY2l0ZXMtYW5kLXJlZnMuaHRtbCNjcm9zcy1yZWZlcmVuY2luZyksIApbbm90ZWJvb2tdKGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9ub3RlYm9vay5odG1sKSwgCltub3RlYm9vazJdKGh0dHA6Ly91Yy1yLmdpdGh1Yi5pby9yX25vdGVib29rKQoKRm9yIHRpbWUgc2VyaWVzOiAKW2ZwcDJdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9mcHAyL2luZGV4Lmh0bWwpCgpGb3IgbWFjaGluZSBsZWFybmluZzogClttbGJlbmNoXShodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvbWxiZW5jaC92ZXJzaW9ucy8yLjEtMSkKCkZvciBkaW1lbnRpb25hbGl0eSByZWR1Y3Rpb246IApbUENBXShodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL2FydGljbGVzLzMxLXByaW5jaXBhbC1jb21wb25lbnQtbWV0aG9kcy1pbi1yLXByYWN0aWNhbC1ndWlkZS8xMTgtcHJpbmNpcGFsLWNvbXBvbmVudC1hbmFseXNpcy1pbi1yLXByY29tcC12cy1wcmluY29tcC8pCgpGb3Igc29sdmluZyBpc3N1ZXMgaW4gcmVzcGVjdCB0byBjb21waWxlcnM6IApbc29sdXRpb24gZm9yIGluc3RhbGxpbmcgQW1lbGlhXShodHRwczovL2dpdGh1Yi5jb20vaW1tdW5vZ2Vub21pY3MvaGFybW9ueS9pc3N1ZXMvMTEzKQoKRm9yIHVuZGVyc3RhbmRpbmcgdGhlIHN0YXRlIG9mIHIgcGFja2FnZXMgZm9yIGRhdGEgZXhwbG9yYXRpb24KW2FydGljbGVdKGh0dHBzOi8vYXJ4aXYub3JnL3BkZi8xOTA0LjAyMTAxLnBkZik=